2014-09-01 186 views
1

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

回答

0

我不完全清楚你在问什么。如果你能提供一个例子说明第四列应该如何,那肯定会有所帮助。我认为na.pass()可能适合你。 na.omit()删除所有包含至少一个NA的行,并且在这里似乎不需要这样。

> np <- na.pass(mydf$var3) 
#[1] 106.17409 88.48014 90.00000  NA 91.62274 91.75860 
#[7] 85.91689 91.06369 100.20514 
> mydf$var4 <- ifelse(np > 90, "big", ifelse(np == 90, "exact", "")) 
#[1] "big" ""  "exact" NA  "big" "big" ""  "big" "big" 
+1

感谢这一个效果很好,似乎喜欢漂亮的紧凑代码 – marcel 2014-09-01 09:08:54

+0

感谢。我通常不会像这样嵌套'ifelse',因为它可能很慢。但如果它的工作... – 2014-09-01 09:26:11

0

是的,没有。陷阱是,当你将一个data.frame放入子集时,NAs也会返回。但是,你并没有这么做,因为mydf$var3 == 90返回的逻辑向量不是数据帧的子集,并且任何TRUE都被“完全90!”替代。而False和NA则不。

mydf$var3 == 90 
[1] FALSE FALSE TRUE NA FALSE FALSE FALSE FALSE FALSE 
+0

非常感谢您的解释。在这种情况下,保证R的行为与我所期望的相同。 – marcel 2014-09-01 09:10:03

0

可能会有所帮助。你可以使用切很窄的减免90(如果被允许)

mydf$var4 <- with(mydf, 
     as.character(cut(var3, breaks=c(-Inf, 89.999999,90.0001, Inf), labels=c("", "exactly 90!", "big")))) 

    mydf 
    # var1 var2  var3  var4 
    #1 type1 1 103.34752   big 
    #2 type2 1 88.58128    
    #3 type3 1 90.00000 exactly 90! 
    #4 type1 2  NA  <NA> 
    #5 type2 2 72.37580    
    #6 type3 2 83.34518    
    #7 type1 3 96.28078   big 
    #8 type2 3 88.91577    
    #9 type3 3 78.68584    
相关问题