2011-10-05 545 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中執行此操作? 請幫我解決這個問題。我試過如果/ else和ifelse,但似乎沒有工作。謝謝

+0

你使用什麼編程語言? –

+2

@TheGiG OP用[tag:r]標記了問題 – Andrie

+0

高度相關:[case statement equivalent](http://stackoverflow.com/q/4622060/168747),[如何在數據中添加列。框架?](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相結合來解決這樣的問題:

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

有很多方法可以做到這一點,但這裏有一個。

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 

這是一個使用carrecode

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

還有一個從this question

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

你可以使用嵌套ifelse

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語句表達邏輯。 –