【问题标题】:R data.table merge two columns from the same tableR data.table 合并同一张表的两列
【发布时间】:2020-06-20 21:13:42
【问题描述】:

我有:

inputDT <- data.table(COL1 = c(1, NA, NA), COL1 = c(NA, 2, NA), COL1 = c(NA, NA, 3))
inputDT
   COL1 COL1 COL1
1:    1   NA   NA
2:   NA    2   NA
3:   NA   NA    3

我想要

outputDT <- data.table(COL1 = c(1,2,3))
outputDT
   COL1
1:    1
2:    2
3:    3

基本上,我有一个 data.table,其中包含多个名称相同的列(值是互斥的),我只需要生成一个列来组合它们。

如何实现?

【问题讨论】:

  • 这能回答你的问题吗? R: coalescing a large data frame ;您应该在那里找到解决方案,除非您想避免致电dplyr;您也可以在 DT 内调用它。

标签: r merge data.table


【解决方案1】:

OP 要求 data.table 解决方案。从 v1.12.4(2019 年 10 月 3 日)版本开始,fcoalesce() 函数可用:

library(data.table)
inputDT[, .(COL1 = fcoalesce(.SD))]
   COL1
1:    1
2:    2
3:    3

【讨论】:

  • 我的一些专栏有文本字段,这种方法很有效。
【解决方案2】:

或者(不如@Uwe 的答案优雅),如果您只有数字和NA,您可以在删除 NA 的同时计算每行的最大值:

library(data.table)
inputDT[, .(COL2 = do.call(pmax, c(na.rm=TRUE, .SD)))]

  COL2
1:    1
2:    2
3:    3

【讨论】:

  • 谢谢!我尝试过,但是当我回电 inputDT 时,我得到了以前的 data.table。
  • do.call() 的替代品是reduce(): inputDT[, .(COL2 = purrr::reduce(.SD, pmax, na.rm = TRUE))]purrr::reduce() 与基本 R 的 Reduce() 类似,但优点是您可以向函数传递额外的参数,而无需编写匿名函数。
  • @Uwe,感谢您的提示。我对purr包了解不多,正在努力学习(慢慢)。
  • @Uwe 当前的解决方案正在将额外的参数传递给 pmax() 而无需编写匿名函数。
  • @sindri_baldur,确实如此。我关于传递额外参数的评论not 指的是 dc37 的回答,而只是指我对使用purrr::reduce() 而不是do.call() 的替代方法的建议。我在讨论purrr::reduce()Reduce() 的优势。
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
相关资源
最近更新 更多