【问题标题】:How to conditionally replace R data.table columns upon merge? [duplicate]如何在合并时有条件地替换 R data.table 列? [复制]
【发布时间】:2017-12-13 18:02:59
【问题描述】:

我有以下两个data.tables

library(data.table)

dt1 = data.table(index_column = c(12, 17, 29, 34, 46), column1 = c("dog", "cat", "bird", "elephant", "bird"), column2 = c(482, 391, 567, 182, 121))

dt2 = data.table(index_column = c(17, 29, 46), column1 = c("cat", "penguin", "bird"))

> dt1
   index_column  column1 column2
1:           12      dog     482
2:           17      cat     391
3:           29     bird     567
4:           34 elephant     182
5:           46     bird     121


> dt2
   index_column column1
1:           17     cat
2:           29 penguin
3:           46    bird

在将这两个 data.table 合并到共享 index_column 上时,

merged = merge(dt1, dt2, by="index_column", all=TRUE)

得到的data.table 是:

   index_column column1.x column2 column1.y
1:           12       dog     482        NA
2:           17       cat     391       cat
3:           29      bird     567   penguin
4:           34  elephant     182        NA
5:           46      bird     121      bird

如果column1.x 的值不是NA,我有兴趣用column1.y 的值替换它们。大多数值将是相同的,但那些不同的值(例如鸟/企鹅)应该被替换。

一个 if 语句可以做到这一点,例如

if ((merged$column1.x != merged$column1.y) & !is.na(merged$column1.y)){
   merged$column1.x = merged$column1.y
}

merged$column1.y = NULL

我担心这不是一个非常 data.table 的解决方案。如果data.table 有数百万行,它将无法很好地扩展。

如何根据 R data.table 中的另一列有条件地替换一列的值?忽略NA,简单地用另一个替换一个是否更有效?

【问题讨论】:

  • 类似dt[!is.na(column1.y), column1.x := column1.y] ?

标签: r dataframe replace merge data.table


【解决方案1】:

我们可以使用基于on 的方法

dt1[dt2, column1 := i.column1, on = .(index_column)]
dt1
#   index_column  column1 column2
#1:           12      dog     482
#2:           17      cat     391
#3:           29  penguin     567
#4:           34 elephant     182
#5:           46     bird     121

【讨论】:

  • 那data.tables就不用合并了吧?
  • @ShanZhengYang 这是一个join,我假设它给出了预期的输出,而无需在输入数据中创建额外的列
  • 如果您有多个列(相同长度)而不是 column1 以及多个索引列,您将如何进行?
猜你喜欢
  • 2014-08-23
  • 2021-03-22
  • 2014-04-20
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 2017-01-02
  • 2016-12-15
相关资源
最近更新 更多