2011-10-05 5 views
18

別の列の4つの値に基づいて新しい列を作成したいとします。別の列の4つの値に基づいて新しい列を作成する

if col1=1 then col2= G; 
if col1=2 then col2=H; 
if col1=3 then col2=J; 
if col1=4 then col2=K. 

これはどのようにしてRで行いますか? 私はこれに対処するために誰かが必要です。私はif/elseとifelseを試しましたが、誰も動作していないようです。ありがとう

+0

どのようなプログラミング言語を使用していますか? –

+2

@TheGiG OPは[tag:r]で質問をマークしました – Andrie

+0

関連性:[case statement equivalent](http://stackoverflow.com/q/4622060/168747)、['dataに列を追加するにはどうすればいいですか?フレーム?」(http://stackoverflow.com/q/4562547/168747)、[Excelシートでのデータクリーニング](http://stackoverflow.com/q/7374314/168747)(この別のリンクセット)。 – Marek

答えて

15

インデックスが整数1:4の値を検索する特別なケースがあります。つまり、ベクトル索引を使用して問題を簡単に解決できます。

まず、いくつかのサンプルデータを作成する:

set.seed(1) 
dat <- data.frame(col1 = sample(1:4, 10, replace = TRUE)) 

次に、ルックアップ値を定義し、所望の結果を見つけるために[サブセットを使用する:

values <- c("G", "H", "J", "K") 
dat$col2 <- values[dat$col1] 

結果:

dat 
    col1 col2 
1  2 H 
2  2 H 
3  3 J 
4  4 K 
5  1 G 
6  4 K 
7  4 K 
8  3 J 
9  3 J 
10 1 G 

より一般的に、あなたはこの種の問題を解決するためにmatchと組み合わせ[サブセットを使用することができます:あなたは、ネストされたifelseを使用することができ

index <- c(1, 2, 3, 4) 
values <- c("G", "H", "J", "K") 
dat$col2 <- values[match(dat$col1, index)] 
dat 
    col1 col2 
1  2 H 
2  2 H 
3  3 J 
4  4 K 
5  1 G 
6  4 K 
7  4 K 
8  3 J 
9  3 J 
10 1 G 
5

これを行うにはいくつかの方法がありますが、ここには1つあります。

set.seed(357) 
mydf <- data.frame(col1 = sample(1:4, 10, replace = TRUE)) 
mydf$col2 <- rep(NA, nrow(mydf)) 
mydf[mydf$col1 == 1, ][, "col2"] <- "A" 
mydf[mydf$col1 == 2, ][, "col2"] <- "B" 
mydf[mydf$col1 == 3, ][, "col2"] <- "C" 
mydf[mydf$col1 == 4, ][, "col2"] <- "D" 

    col1 col2 
1  1 A 
2  1 A 
3  2 B 
4  1 A 
5  3 C 
6  2 B 
7  4 D 
8  3 C 
9  4 D 
10 4 D 

はここcarさんrecodeを使用して一つです。 this questionから

library(car) 
mydf$col3 <- recode(mydf$col1, "1 = 'A'; 2 = 'B'; 3 = 'C'; 4 = 'D'") 

つ以上:

mydf$col4 <- c("A", "B", "C", "D")[mydf$col1] 
1

あなたは?symnumを見ている可能性があります。

あなたのケースでは、のようなもの:

col2<-symnum(col1, seq(0.5, 4.5, by=1), symbols=c("G", "H", "J", "K")) 

は、あなたが近くに取得する必要があります。

21

col2 <- ifelse(col1==1, "G", 
     ifelse(col1==2, "H", 
     ifelse(col1==3, "J", 
     ifelse(col1==4, "K", 
         NA )))) # all other values map to NA 

それはやり過ぎだ。この単純なケースではなく、より複雑なため...

+1

"より複雑なもののために..." - より複雑なものは入れ子にされた 'ifelse'を**より良い**アイデアにしますか?それは私には直観的ではありません。 –

+0

@TheRedPeaより複雑な条件では、異なる列に基づいており、互いに関連していません。 – Marek

+0

ええ、私は選択肢がないかもしれないが、if文で論理を表現すると思います。 –

関連する問題