我學習了這種方法來計算新列的值,並以現有列中的值爲條件。實際上,我從之前的帖子中挑選了這個和其他一些令人難以置信的方便提示:What is the most useful R trick?。按R中另一列中的值計算行條目
mydf <- expand.grid(var1 = c('type1', 'type2', 'type3'), var2 = c(1, 2, 3))
mydf$var3 <- rnorm(dim(mydf)[1], mean=90, sd=10)
mydf$column2[mydf$var3 > 90] <- "big" #now my conditional replacement
偉大的作品,但有一個令人擔憂的評論說,「有一個小陷阱這裏[等等。如果DF $ COLUMN1包含NA值,使用==將拉出任何數值子集化即等於。x和任何的NAS避免這種情況,使用「在%%」,而不是「==」而另一位評論避免這種使用na.omit但是,我並沒有觀察到這種現象:
mydf <- expand.grid(var1 = c('type1', 'type2', 'type3'), var2 = c(1, 2, 3))
mydf$var3 <- rnorm(dim(mydf)[1], mean=90, sd=10)
mydf$var3[3] <- 90
mydf$var3[4] <- NA
is.na(mydf$var3[4]) # True!
mydf$column4[mydf$var3 == 90] <- "exactly 90!" # possible unintended behavior w/ row 4?
mydf$column4[mydf$var3 > 90] <- "big"
mydf # if there is a trap shouldn't mydf$column4[4] == "exactly 90!" ?
中當然,我對正確編碼感興趣,並避免任何可能的錯誤,但無法弄清楚如何使用na.omit將NA明確地分配給var3中存在NA的行,與我們針對其他邏輯條件所採用的方式相同,像var3 == 90.問題:a)爲什麼我沒有看到我們被警告過的意外匹配,b)我將如何使用is.na來明確地避免這種情況,c)是否還有其他意想不到的行爲意識到這種方法?
感謝這一個效果很好,似乎喜歡漂亮的緊湊代碼 – marcel 2014-09-01 09:08:54
感謝。我通常不會像這樣嵌套'ifelse',因爲它可能很慢。但如果它的工作... – 2014-09-01 09:26:11