【问题标题】:R: how to fill in missing value with another dataset effeciently? [duplicate]R:如何有效地用另一个数据集填充缺失值? [复制]
【发布时间】:2017-02-03 15:14:00
【问题描述】:

两个输入数据集:

A <- data.frame(id = c(1, 2, 3), value = rep(NA, 3))
A 
     id value
  <dbl> <lgl>
1     1    NA
2     2    NA
3     3    NA

B <- data.frame(id = c(3, 2), value = c(3, 2))
B
  id value
1  3     3
2  2     2

将B中的可用值加到A中后,预计有:

A 
     id value
  <dbl> <lgl>
1     1    NA
2     2    2
3     3    3

可以通过下面的for循环来实现。但是,for 循环通常非常慢。如何更高效?

for(i in 1:nrow(A)){
  item <- A[i,]
  print(item)
  if(is.na(item$value) && (item$id %in% B$id)){
    A[i, "value"] <- B[B$id == item$id,]$value
  }
}

加入可以解决这个问题。但需要一个规则来解决冲突。

【问题讨论】:

  • @nrussell,这需要B覆盖A。它属于哪种类型的join?
  • 左连接然后合并 --left_join(A, B, by = "id") %&gt;% mutate(value = coalesce(value.x, value.y)) %&gt;% select(id, value).
  • 谢谢。这就是答案。
  • 这是一个带有match的基本R方法:A$value[A$id %in% B$id] &lt;- B$value[match(A$id, B$id)[!is.na(match(A$id, B$id))]],适用于该示例。

标签: r dplyr


【解决方案1】:

您可以使用连接 (dplyr):

library(dplyr)

A <- data.frame(id = c(1, 2, 3), value = rep(NA, 3))
B <- data.frame(id = c(3, 2), value = c(3, 2))

A %>% left_join(B, by='id') %>%
  mutate(value = ifelse(is.na(value.x),value.y,value.x))

查看您问题的评论以了解加入数据的全部内容。

【讨论】:

  • 谢谢。在这种情况下,mutate 与 join 效果很好。
  • ifelse(is.na(value.x),value.y,value.x)也可以通过coalesce(value.x, value.y)实现。
猜你喜欢
  • 2023-03-29
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多