使用相同的列填充另一个数据框中的缺失值

2023-12-31

我搜索了各种连接问题,但似乎没有一个能完全回答这个问题。我有两个数据框,每个数据框都有一个 ID 列和几个信息列。

df1 <- data.frame(id = c(1:100), color = c(rep("blue", 25), rep("red", 25), 
                  rep(NA, 25)), phase = c(rep("liquid", 50), rep("gas", 50)),
                  rand.col = rnorm(100))

df2 <- data.frame(id = c(51:100), color = rep("green", 50), phase = rep("gas", 50))

正如您所看到的,df1 缺少 df2 中存在的一些信息,而 df2 只是所有 id 的子集,但它们都有一些相似的列。有没有办法根据 DF2 中的匹配 ID 来填充 df1 中的缺失值?

我找到了一个类似的问题 https://stackoverflow.com/questions/34697032/fill-in-missing-values-nas-with-values-from-another-dataframe-in-r建议使用合并,但是当我尝试它时,它删除了两个数据帧中不存在的所有 id。另外,它需要手动删除重复的列,并且在我的真实数据集中,会有大量重复的列,这使得这样做很麻烦。即使忽略这一点,

推荐的解决方案:

df1 <- setNames(merge(df1, df2)[-2], names(df1))

and

df1[is.na(df1$color), "color"] <- df2[match(df1$id, df2$id), "color"][which(is.na(df1$color))]

不适合我,抛出各种错误。

我想到的另一种解决方案是使用rbind然后丢弃不完整的案例。问题是,在我的真实数据集中,虽然有共享列,但也有非共享列,因此我必须创建共享列的中间对象,rbind,然后丢弃不完整的情况,然后join与原始对象一起重新获得删除的列。这似乎是不必要的迂回。

在这个例子中它看起来像

df2 = rbind(df1[,colnames(df2)], df2)
df2 = df2[complete.cases(df2),]
df2 = merge(df1[,c("id", "rand.col")], df2, by = "id")

并且,如果两个数据帧之间存在任何完全重复的行,我需要添加

df2 = unique(df2)

这个解决方案可以工作,但是很麻烦,并且随着匹配的列数的增加,情况会变得更糟。有更好的解决方案吗?

-编辑-修复了 Sathish 指出的示例数据中的问题

-edit2- 扩展示例数据

df1 = data.frame(id = c(1:100),  wq2 = rnorm(50), wq3 = rnorm(50), wq4 = rnorm(50), 
wq5 = rnorm(50))

df2 = data.frame(id = c(51:100), wq2 = rnorm(50), wq3 = rnorm(50), wq4 = rnorm(50), 
wq5 = rnorm(50))

这些数据帧表示有许多列包含不完整数据,而第二个数据帧包含所有缺失数据的情况。理想情况下,我们不需要单独列出每个列wq1 := i.wq1 etc.


如果您只想通过以下方式加入id列,您可以删除phase in the on下面的代码子句。

此外,您在问题中的数据存在差异,这些差异已在本答案中发布的数据中得到纠正。

library('data.table')
setDT(df1)  # make data table by reference
setDT(df2)  # make data table by reference
df1[ i = df2, color := i.color, on = .(id, phase)] # join df1 with df2 by id and phase values, and replace color values of df2 with color values of df1

tail(df1)
#     id color phase   rand.col
# 1:  95 green   gas  1.5868335
# 2:  96 green   gas  0.5584864
# 3:  97 green   gas -1.2765922
# 4:  98 green   gas -0.5732654
# 5:  99 green   gas -1.2246126
# 6: 100 green   gas -0.4734006

单行:

setDT(df1)[df2, color := i.color, on = .(id, phase)]

Data:

set.seed(1L)
df1 <- data.frame(id = c(1:100), color = c(rep("blue", 25), rep("red", 25), 
                                           rep(NA, 50)), phase = c(rep("liquid", 50), rep("gas", 50)),
                  rand.col = rnorm(100))

df2 <- data.frame(id = c(51:100), color = rep("green", 50), phase = rep("gas", 50))

编辑:根据问题中发布的新数据

Data:

set.seed(1L)
df1 = data.frame(id = c(1:100),  wq2 = rnorm(50), wq3 = rnorm(50), wq4 = rnorm(50), 
                 wq5 = rnorm(50))
set.seed(2423L)
df2 = data.frame(id = c(51:100), wq2 = rnorm(50), wq3 = rnorm(50), wq4 = rnorm(50), 
                 wq5 = rnorm(50))

Code:

library('data.table')
setDT(df1)[ id == 52, ]
#    id       wq2        wq3        wq4         wq5
# 1: 52 0.1836433 -0.6120264 0.04211587 -0.01855983

setDT(df2)[ id == 52, ]
#    id       wq2       wq3        wq4       wq5
# 1: 52 0.3917297 -1.007601 -0.6820783 0.3153687

df1[df2, `:=` ( wq2 = i.wq2,
                wq3 = i.wq3,
                wq4 = i.wq4,
                wq5 = i.wq5), on = .(id)]

setDT(df1)[ id == 52, ]
#    id       wq2       wq3        wq4       wq5
# 1: 52 0.3917297 -1.007601 -0.6820783 0.3153687
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用相同的列填充另一个数据框中的缺失值 的相关文章

  • Rscript 正在绘制 PDF

    我有一个简单的R http en wikipedia org wiki R 28programming language 29脚本 当它通过 Rscript exe 运行时 默认情况下它会绘制为 PDF 文件 我希望脚本打开一个绘图窗口 我
  • 绘图不适合 R 窗口

    我正在使用metaR 中的包对比例进行荟萃分析 我的分析中有大约一百项研究 当我打字时forest result 创建我的森林图 它可以工作 但图形在顶部和底部被切掉 无论我做什么 它都不适合绘图窗口 我对如何解决这个问题感到困惑 有任何想
  • 为什么 ggplot2 图例不结合手动填充和缩放值?

    预期行为 如果我用 ggplot2 创建一个绘图并使用单独的形状和填充比例来描绘数据 我希望图例会在 白色 填充点 看起来是空心的 和 黑色 填充点 看起来不空洞的 在下面的示例代码中 Windows 的图例项应为白色空心点 Linux 的
  • 不同大小组的高效递归随机抽样

    这个问题是我之前关于递归随机抽样问题的后续问题高效的递归随机采样 https stackoverflow com questions 69824065 efficient recursive random sampling 当组大小相同或每
  • ggplot2 的组合图(不在单个图中),使用 par() 或 layout() 函数? [复制]

    这个问题在这里已经有答案了 我一直在考虑使用 par 或 layout 函数来组合 ggplots 可以使用这些功能吗 假设我想绘制 ggplot 散点图和 ggplot 直方图 我想将这两个地块合并起来 而不是在一个地块中 是否适用 我在
  • 替换为 NA

    我有一个包含条目的数据框 看来这些值没有被视为 NA 因为 is na 返回 FALSE 我想将这些值转换为 NA 但找不到方法 Use dfr dfr
  • 是否可以使用像“tz=NULL”这样的东西?...“as.POSIXct”默认为依赖于语言环境的时区(与“as.Date”不同),这会导致问题

    我知道这是一个长期存在 根深蒂固的问题 但这是我经常遇到的问题 而且我看到初学者R经常与此斗争 我希望有一个令人满意的解决方案 到目前为止 我的谷歌和 SO 搜索都是空的 但如果在其他地方重复 请指出正确的方向 TL DR 有没有办法使用类
  • R 在 Ubuntu 中通过代理连接

    我在 Ubuntu 12 04 上安装了 RStudio 0 97 168 当我尝试安装 gstat 库时出现以下错误 install packages gstat dependencies TRUE Warning in install
  • 使用 roxygen2 记录数据集

    我正在尝试使用 roxygen2 记录 R 包中的一些数据集 仅考虑其中之一 I have mypkg data CpG human GRCh37 RDa 其中包含一个名为的对象CpG human GRCh37 和一个名为 mypkg R
  • 如何在闪亮的应用程序中显示矩阵,并用条件指定颜色?

    我有一个具有正值和负值的矩阵 M 我正在尝试使用 DT 包在闪亮的应用程序中显示为表格 我想用不同的颜色显示矩阵 红色的正数和负数 例如 到目前为止 我只能以一对一的方式添加颜色 但我想以这种方式添加颜色 如果matrix values g
  • 使用 dplyr 按组计算加权平均值(并复制其他方法)

    我对语法感到困惑dplyr当尝试计算加权平均值时 我听从大卫的建议here https stackoverflow com a 27609266 1457380 语法非常透明 因此很有吸引力 但它似乎没有按我的预期工作 低于加权平均值是针对
  • Sweave 缓存包

    我正在尝试编写一份报告 我的问题是每次我编译 R 时都会加载我在报告中使用的包 如 ggplot2 MASS cubature 这是非常耗时的 有没有办法查包裹 I found 缓存编织但它不起作用 这是我在 sweave 文件中添加的块
  • 当 header=TRUE 时 read.fwf 出错

    我的模拟数据如下所示 LastName Date email CreditCardNum AgeZip Amount Paul 21 02 14 email protected cdn cgi l email protection 4241
  • 如何在 ggplot2 中向 x 轴添加特定值?

    我正在尝试在 ggplot2 中绘制图表 我希望 x 轴显示 2 84 以及下面键入的序列 除了在 Breaks 中输入所有精确值之外 还有其他方法吗 我尝试了谷歌 但它没有解决我的问题 scale x continuous limits
  • 将英寸高度的字符向量转换为厘米?

    我得到一个字符向量 tibble H c 6 2 5 10 5 5 5 1 5 5 5 4 我想将其转换为厘米 请告知我该怎么做 有几种方法可以使用 1 阅读与fread粘贴到单个字符串后 library data table fread
  • ggplot2:图例中的斜体

    我正在尝试编辑图例中的标签 以便第一个标签 WT 为纯文本 而后续 7 个标签为斜体 我一直在使用element text face c plain rep italic 7 但这导致没有任何标签被转换为斜体 我有点困惑为什么它不起作用 因
  • 在 R 中使用 ggplot2 叠加两个图

    有两个数据框 df1 df2我需要使用 ggplot2 创建线图并显示在同一个图表上 df1 x y 2 30 4 25 6 20 8 15 df2 x y 2 12 4 16 6 20 8 24 用于绘制第一个 df p1 lt ggpl
  • 通过排列进行多组测试

    我有一个 df 其中包含与两个实验相关的两组值 value 1 和 value 2 一个实验包含两组 0 和 1 另一个实验包含三组 0 1 2 test group Value 1 Value 2 AA 0 15 1 11 2 AA 0
  • 如何将带有几行代码的字符数组转换为 data.frame?

    我有以下数组 my list lt c Jan 01 Dec 31 00 00 24 00 Jan 01 Jun 30 12 00 18 00 Jul 06 Dec 31 09 00 19 00 导致以下结果的最短代码是什么 x1 x2 x
  • 使用 ggplot2 在一张画布上绘制多个图形[重复]

    这个问题在这里已经有答案了 我正在尝试根据此表将两个 ggplot2 图合并为一个图 Type RatingA RatingB 1 One 3 36 2 Two 5 53 3 One 5 57 4 One 7 74 5 Three 4 38

随机推荐