【问题标题】:Add unique rows to dataframe (opposite of intersect)向数据框添加唯一行(与相交相反)
【发布时间】:2019-11-27 12:43:06
【问题描述】:

我对 R 比较陌生,但慢慢找到了自己的方式。但是我遇到了一个问题,希望有人能帮助我。

假设我有两个数据框(我们称它们为 A 和 B),都包含调查回复。 A 包含来自第一组人的所有响应。 B 包含第二组人的回答,加上第一组人的回答,但他们的回答设置为 NA。一个例子:

Dataframe A:
Household Individual Answer_A Answer_b
1         2          5        6
1         3          6        6
2         1          2        3

Dataframe B:
Household Individual Answer_A Answer_b
1         1          3        6
1         2          NA       NA
1         3          NA       NA
2         1          NA       NA
2         2          4        7

我想获得一个包含所有个人及其响应的数据框:

Dataframe C:
Household Individual Answer_A Answer_b
1         1          3        6
1         2          5        6
1         3          6        6
2         1          2        3
2         2          4        7

如果我只有两个数据集,我可以使用 rbind.fillrbind.fill(B, A) 来获取数据帧 C,因为 B 中的 NA 会被 A 中的答案覆盖。 但是...如果我必须添加第三个数据集 D,它将由 A 和 B 中的人的 NA 组成,我将无法使用此解决方案。那时我能做什么?我查看了 intersect、outersect、不同形式的连接,但似乎想不出一个好的解决方案。

有什么想法吗?

【问题讨论】:

  • 你试过merge吗?类似na.omit(merge(dfA, dfB, all = TRUE))
  • 你可以只删除dfB中带有NAs的行,然后用dfA进行rbind,rbind(dfA,dfB[complete.cases(dfB),])
  • @sotos 我尝试了我的数据集,但最终得到了一个空数据框。以“正常方式”合并它们(没有 na.omit)会丢弃几乎所有观察值(从 21000 到 83),但看不出为什么保留了这 83 个。
  • 不知道为什么......
  • @StupidWolf 最终被证明是最简单的解决方案。谢谢!

标签: r dataframe merge unique na


【解决方案1】:

也许你可以left_join,然后使用coalesce

library(dplyr)

left_join(B, A, by = c("Household", "Individual")) %>%
  mutate(Answer_A = coalesce(Answer_A.x, Answer_A.y),
         Answer_B = coalesce(Answer_b.x, Answer_b.y)) %>%
  select(-matches("\\.x|\\.y"))

#  Household Individual Answer_A Answer_B
#1         1          1        3        6
#2         1          2        5        6
#3         1          3        6        6
#4         2          1        2        3
#5         2          2        4        7

数据

A <- structure(list(Household = c(1L, 1L, 2L), Individual = c(2L, 
3L, 1L), Answer_A = c(5L, 6L, 2L), Answer_b = c(6L, 6L, 3L)), class = "data.frame", 
row.names = c(NA, -3L))

B <-  structure(list(Household = c(1L, 1L, 1L, 2L, 2L), Individual = c(1L, 
2L, 3L, 1L, 2L), Answer_A = c(3L, NA, NA, NA, 4L), Answer_b = c(6L, 
NA, NA, NA, 7L)), class = "data.frame", row.names = c(NA, -5L))

【讨论】:

  • 谢谢!我会调查一下。没想过使用 mutate & coalesce。
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 2014-02-01
  • 2021-12-23
  • 2023-03-16
  • 2019-06-22
  • 1970-01-01
  • 2021-06-10
  • 2015-10-02
相关资源
最近更新 更多