2012-12-02 76 views
4

我有一個相當簡單的問題,我目前正在努力。如果我有一個例子數據框:使用if語句填充列

a <- c(1:5) 
b <- c(1,3,5,9,11) 
df1 <- data.frame(a,b) 

如何創建一個新的列(「C」),然後使用如果B列語句填充。例如:在B,其爲1或2 在B,其是用於在B,其大於6

那些值3和5之間 「兔」的那些值「狗」的那些值 「貓」因此使用dataframe df1的列'c'會讀取:cat,dog,dog,rabbit,rabbit。

非常感謝提前。

+0

這是經常被問到,看這裏的例子:http://stackoverflow.com/questions/12379128/r-switch-statement-on-comparisons/12379251#12379251。 – flodel

+0

@ flodel:+1在你的答案中使用findInterval。正如你所說,這已被要求多次回答。 –

回答

2
df1 <- 
    transform(
     df1 , 
     c = 
      ifelse(b %in% 1:2 , 'cat' , 
      ifelse(b %in% 3:5 , 'dog' , 'rabbit'))) 
1

雖然ifelse()是有用的,但它有時並不能提供人們直覺上期望的內容。所以,我喜歡把它寫出來。

a <- c(1:5) 
b <- c(1,3,5,9,11) 
df1 <- data.frame(a,b) 

species <- function(x) { 
if(x == 1 | x == 2) y <- "cat" 
if(x > 2 & x < 6) y <- "dog" 
if(x > 6) y <- "rabbit" 
return(y) 
} 

df1$c <- sapply(df1$b,species) 
5
dfrm$dc <- c("dog", "cat", "rabbit")[ findInterval(dfrm$b, c(1, 2.5, 5.5, Inf)) ] 

的findInterval方法會比嵌套ifelse策略快得多,而且我猜非常快於遍歷嵌套的if語句的功能。當我們選擇低效算法時,我們使用更大數據的人會注意到這些差異。

這實際上並未解決請求,但我並不總是認爲R的新用戶將知道最有表現力或有效的問題解決方法。 「使用IF」的請求聽起來像努力翻譯兩種主要宏統計處理器SPSS和SAS的典型編碼方法。控制結構通常不是重新編碼列的有效方法,因爲其第一個位置的參數將僅針對第一個元素進行評估。它自己不處理一列,而ifelse函數會這樣做。 cut函數可能已在此處使用(使用適當的breakslabels參數),但它將傳遞factor值 - 而不是字符值。選擇findInterval方法是因爲其返回多個級別的能力(其中一個ifelse不能)。我認爲鏈接或嵌套ifelse在大約2或3層嵌套後變得很難看,並且很混亂。

+3

任何來自未來的人都會在這個答案中磕磕絆絆,在方括號前有一個缺失的親密關係。 – Daniel

+0

@Daniel:謝謝你指出這個錯誤。它在這裏等了超過一年的時間,直到有人改正它爲止。他們不恰當地在我用第二段取代的答案正文的文本中留下了解釋。 –