2014-09-01 96 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    
相關問題