我学习了这种方法来计算新列的值,并以现有列中的值为条件。实际上,我从之前的帖子中挑选了这个和其他一些令人难以置信的方便提示: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