【问题标题】:Replace NA by value of another variable [duplicate]用另一个变量的值替换 NA [重复]
【发布时间】:2019-02-05 10:36:03
【问题描述】:

说这是我的数据。

mydat=structure(list(ItemRelation = c(158200L, 158204L), DocumentNum = c(1715L, 
1715L), CalendarYear = c(2018L, 2018L), X1 = c(0L, 0L), X2 = c(0L, 
0L), X3 = c(0L, 0L), X4 = c(NA, NA), X5 = c(107L, 105L), X6 = c(NA, 
NA)), .Names = c("ItemRelation", "DocumentNum", "CalendarYear", 
"X1", "X2", "X3", "X4", "X5", "X6"), class = "data.frame", row.names = c(NA, 
-2L))

如何创建条件,如果X6=NA,则将NA 替换为X5 的值?

在本例中,所需的输出为:

  ItemRelation DocumentNum CalendarYear X1 X2 X3 X4  X5  X6
1       158200        1715         2018  0  0  0 NA 107 107
2       158204        1715         2018  0  0  0 NA 105 105

【问题讨论】:

  • with(mydat, ifelse(is.na(X6), X5, X6))
  • 试试ifelse 喜欢ifelse(is.na(X6), X5, X6)
  • @RonakShah 看起来像是对我的回答。如果您以评论而不是答案的形式发布,它不能被赞成或反对,或被接受,查看问题队列的人不会看到答案已发布(并且可能被接受)等等......
  • @RonakShah,您重复的帖子对我没有帮助。但是森林生态学家的解决方案很棒
  • @duckmayr 谢谢,我之所以没有将其发布为答案,是因为这个问题似乎是重复的,我正在寻找一个。 :)

标签: r dplyr


【解决方案1】:

您可以在基础 R 中使用 sapply

mydat[,c("X5","X6")] <- with(mydat, sapply(mydat[8:9],function(x) ifelse(is.na(X6),X5,X6)))

给出想要的解决方案:

  ItemRelation DocumentNum CalendarYear X1 X2 X3 X4  X5  X6
1       158200        1715         2018  0  0  0 NA 107 107
2       158204        1715         2018  0  0  0 NA 105 105

解释:

ifelse 检查给定行的X6 值是否为NA,如果是,则从该行中选择X5 的值。如果X6 不是 NA,则只使用X6

sapply 允许您将此ifelse 函数快速应用于 data.frame 的每一行。

with 更改环境,以便您“在”您的 mydat 对象中,这样您就可以在不使用 $[] 的情况下引用其部分。

【讨论】:

  • 如果X5 的内容被复制到所有其他列上,这怎么可能是正确的答案?甚至ItemRelationDocumentNum 都被覆盖了。
  • 您的编辑让情况变得更糟。 X6 列现在替换为 两个X6.X5X6.X6。这是由对sapply() 的不必要调用引起的。恕我直言,正确的基本 R 解决方案是 mydat$X6 &lt;- with(mydat, ifelse(is.na(X6),X5,X6)),但这已经由 Ronak Shah 提出。
  • @Uwe,我注意到我第一次完全看错了东西,这就是我最初合并sapply 的原因。我坚持使用它,因为这是 OP“接受”的方法,但后来我意识到我在编辑中也犯了一个错字。现在已经修复了。我同意罗纳克的回答更好。如果他不添加它作为答案,我可以将其合并到我的。
猜你喜欢
  • 2013-08-06
  • 2019-02-08
  • 2020-03-24
  • 2016-01-09
  • 1970-01-01
  • 2015-04-25
  • 2021-06-28
  • 2019-11-21
  • 1970-01-01
相关资源
最近更新 更多