我有一個相當簡單的問題,我目前正在努力。如果我有一個例子數據框:使用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。
非常感謝提前。
我有一個相當簡單的問題,我目前正在努力。如果我有一個例子數據框:使用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。
非常感謝提前。
df1 <-
transform(
df1 ,
c =
ifelse(b %in% 1:2 , 'cat' ,
ifelse(b %in% 3:5 , 'dog' , 'rabbit')))
雖然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)
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
函數可能已在此處使用(使用適當的breaks
和labels
參數),但它將傳遞factor
值 - 而不是字符值。選擇findInterval
方法是因爲其返回多個級別的能力(其中一個ifelse
不能)。我認爲鏈接或嵌套ifelse
在大約2或3層嵌套後變得很難看,並且很混亂。
任何來自未來的人都會在這個答案中磕磕絆絆,在方括號前有一個缺失的親密關係。 – Daniel
@Daniel:謝謝你指出這個錯誤。它在這裏等了超過一年的時間,直到有人改正它爲止。他們不恰當地在我用第二段取代的答案正文的文本中留下了解釋。 –
這是經常被問到,看這裏的例子:http://stackoverflow.com/questions/12379128/r-switch-statement-on-comparisons/12379251#12379251。 – flodel
@ flodel:+1在你的答案中使用findInterval。正如你所說,這已被要求多次回答。 –