【问题标题】:R- combining two data frames by replacing common referenced valuesR-通过替换公共引用值来组合两个数据帧
【发布时间】:2016-05-22 21:08:10
【问题描述】:

让我有这样的数据帧(df1 和 df2):

df1

ID  y
4   12
2   65
3   7
5   878
1   1
7   122

df2

ID  z

2   90
5   16
1   22

在 df2 中,ID 也可在 df1 中使用。即 df2 是 df1 在 ID 列方面的子集。

我想创建一个新的数据框(df3),这样

ID  y
4   12
2   90
3   7
5   16
1   22
7   122

即,在 df1 中,y 值被 df2 中的 z 值替换为公共 ID。

如何使用 R 来做到这一点?我会很高兴得到任何帮助。非常感谢。

【问题讨论】:

  • 这是一个有趣的:within(merge(df1, df2, all = TRUE), { y[!is.na(z)] <- na.omit(z); rm(z) }),但行顺序会不同

标签: r


【解决方案1】:

使用data.table我们可以连接两个data.tables并通过引用更新y

library(data.table)   ## version 1.9.6

## Using your original data.frame objects you would use
# dt1 <- as.data.table(df1)
# dt2 <- as.data.table(df2) 

dt1 <- data.table(id = c(4,2,3,5,1,7),
                  y = c(12, 65, 7, 878, 1, 122))

dt2 <- data.table(id = c(2,5,1),
                  z = c(90, 16, 22))


dt1[ dt2, on="id", y := z  ]
dt1
#    id   y
# 1:  4  12
# 2:  2  90
# 3:  3   7
# 4:  5  16
# 5:  1  22
# 6:  7 122

您还可以在keys 中指定连接列(这将适用于旧版本的data.table

setkey(dt1, id)
setkey(dt2, id)

dt1[ dt2, y := z  ]
dt1

【讨论】:

  • 可以加transform(merge(dt1, dt2, by = "id", all.x=TRUE), y = ifelse(is.na(z), y, z), z = NULL)
  • @orcim - 它们需要设置为data.table 对象。试试dt &lt;- as.data.table(df)
  • [.data.table(dt1, dt2, on = "id", 中的错误:未使用的参数 (on = "id")
  • @orcim 哪个版本的data.table?
  • @orcim 好的,您需要 1.9.6 才能使用 on=。或者,您可以尝试其他建议之一,因为它们似乎也都有效。
猜你喜欢
  • 1970-01-01
  • 2022-11-28
  • 2020-10-15
  • 2021-12-28
  • 2020-10-26
  • 2022-01-19
  • 2021-12-30
  • 2021-10-24
  • 1970-01-01
相关资源
最近更新 更多