在另一列中以is.na为条件替换行值

时间:2014-09-07 14:55:51

标签: r replace conditional

简单的逻辑替换问题;我有一个数据框,如:

mydf <- expand.grid(var1 = c('type1', 'type2'), var2 = c(7, 6, "NA"), var3 = 9)

我想用var2中的值替换var3中的值,除非var2是NA。因此得到的新var3应该是7,7,6,6,NA,NA。在试图解决这个问题时,我注意到了

mydf$var3[mydf$var2 == 7] <- 5

正确地将mydf的第1行和第2行标识为需要替换,并且仅留下最后四行,因此我得到var3 = 5,5,9,9,9,9。但是,如果我尝试

    mydf$var3[!is.na(mydf$var2)] <- 5

我得到var3 = 5,5,5,5,5,5。那么为什么它没有跳过最后两行,其中var2是NA?接下来的问题是,不知道如何将替换值变为var2而不是常量。当我尝试

mydf$var3[!is.na(mydf$var2)] <- mydf$var2

我得到var3 = 1,1,2,2,3,3。我根本不明白。

1 个答案:

答案 0 :(得分:0)

与评论中一样,字符串"NA"不是NA值。因此is.na("NA")FALSE并且所有行都已选中。只需使用"NA"替换定义中的NA

mydf <- expand.grid(var1 = c('type1', 'type2'), var2 = c(7, 6, NA), var3 = 9)
mydf$var3[!is.na(mydf$var2)] <- mydf$var2[!is.na(mydf$var2)]

请注意,您不能只用mydf$var2替换左侧,因为它们现在具有不相等的长度 - 在您没有此错误之前,因为没有NA