我有一个情况,我有三个数据帧.使用下面的虚拟数据,数据帧设置如下:

  • Df有一个ID变量和多个附加变量

  • DF1有一个ID变量来匹配df和varX_J的信息,其中X 是00:19(作为字符),J是变量的描述 名字.对于所有变量,前三个字母保持相同(var

  • Df2与df1相同,但信息不同.

我需要用df合并df1和df2,同时合并列中的数据.Df1和df2有相同的观察结果.它们should具有不同的信息(例如,如果在df1中的var09_marted中有ID 1的值,那么在df2中的同一单元格中就不应该有信息.然而,数据是杂乱的,可能有一些地方不是这样的.

要创建这个虚拟数据,我有以下脚本:

library('dplyr')

df <- data.frame(id = c(1:20),
                 og_var1 = sample(c(1:50), 20, replace=TRUE),
                 state = sample(c(1:52), 20, replace=TRUE),
                 race = sample(c(1:5), 20, replace=TRUE)
                 )

df1 <- left_join(data.frame(id = (1:20)), data.frame(
                  id = c(3,6,9,12),
                  var09_married = c(1,NA,2,1),
                  var09_happiness = c(1,NA,3,2),
                  var10_married = c(NA,1,2,2),
                  var10_happiness = c(NA,5,2,5)), by=c("id"))

df2 <- left_join(data.frame(id = (1:20)), data.frame(
                  id = c(3,6,11,15),
                  var09_married = c(NA,1,1,1),
                  var09_happiness = c(NA,3,3,2),
                  var10_married = c(1,NA,2,1),
                  var10_happiness = c(2,NA,4,4)), by=c("id"))


df <- left_join(df, df1, by=c("id"))
df <- left_join(df, df2, by=c("id"))

我想要的是在不复制列的情况下将这些信息合并在一起.如果df1和df2中的信息在同一位置(例如,id3在df1和df2中都有var10的信息),那么我希望在最终的数据帧中有来自df1的信息.但如果此信息被删除,我也想创建一个旗帜.因此,最终的数据帧应该如下所示:

dput(df)
structure(list(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20), og_var1 = c(6L, 4L, 33L, 7L, 
37L, 16L, 34L, 42L, 37L, 37L, 39L, 41L, 24L, 33L, 30L, 2L, 20L, 
29L, 33L, 47L), state = c(2L, 35L, 11L, 14L, 16L, 16L, 40L, 39L, 
28L, 13L, 5L, 26L, 28L, 15L, 13L, 31L, 43L, 25L, 16L, 28L), race = c(5L, 
4L, 2L, 1L, 1L, 2L, 3L, 2L, 2L, 4L, 2L, 3L, 5L, 2L, 3L, 2L, 5L, 
1L, 5L, 5L), var09_married = c(NA, NA, 1, NA, NA, 1, NA, NA, 
2, NA, 1, 1, NA, NA, 1, NA, NA, NA, NA, NA), var09_happiness = c(NA, 
NA, 1, NA, NA, 3, NA, NA, 3, NA, 3, 2, NA, NA, 2, NA, NA, NA, 
NA, NA), var10_married = c(NA, NA, 1, NA, NA, 1, NA, NA, 2, NA, 
2, 2, NA, NA, 1, NA, NA, NA, NA, NA), var10_happiness = c(NA, 
NA, 2, NA, NA, 5, NA, NA, 2, NA, 4, 5, NA, NA, 4, NA, NA, NA, 
NA, NA), flag = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0)), row.names = c(NA, -20L), class = "data.frame")

推荐答案

try rows_patch,而不是加入:

library(dplyr)

df1 |>
  rows_patch(df2, by = "id") |>
  right_join(df, by = "id")

从文档?rows_patch:

工作方式与rows_update()类似,但仅覆盖NA个值

这意味着,如果存在以df1为单位的值,它们将保持不变.如果df1中有NA个值,而df2中有值,则这些值将被"打补丁"(即用df2中的值更新).

但是,根据您的需要,您可能会考虑使用rows_update,这将使用df2中的一行更新df1中的整行(如果匹配).

R相关问答推荐

从有序数据中随机抽样

在"gt"表中添加第二个"groupname_col",而不连接列值

如何在modelsummary中重命名统计数据?

在ggplot2中更改小提琴情节的顺序

R—将各种CSV数字列转换为日期

从一个列表的框架中移除列表包装器

从圆到R中的多边形的标绘雷达图

跨列查找多个时间报告

按时间顺序对不同事件进行分组

从多层嵌套列表构建Tibble?

根据约束随机填充向量的元素

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

以任意顺序提取具有多个可能匹配项的组匹配项

R try Catch in the loop-跳过缺少的值并创建一个DF,显示跳过的内容

如何在刻面和翻转堆叠条形图中对齐geom_text()

在鼠标悬停时使用Plotly更改geom_point大小

条形图中的条形图没有try 赋予它们的 colored颜色

有没有办法更改ggplot2中第二个y轴的比例限制?

如何在一种 colored颜色 中设置数值变量的 colored颜色 和高于阈值的 colored颜色 点?

创建由三个单独的shapefile组成的单个 map