r - data.table 相当于 tidyr::complete()

标签 r data.table tidyr tidyverse

tidyr::complete()data.frame 添加行对于数据中缺失的列值的组合。例子:

library(dplyr)
library(tidyr)

df <- data.frame(person = c(1,2,2),
                 observation_id = c(1,1,2),
                 value = c(1,1,1))
df %>%
  tidyr::complete(person,
                  observation_id,
                  fill = list(value=0))

产量
# A tibble: 4 × 3
  person observation_id value
   <dbl>          <dbl> <dbl>
1      1              1     1
2      1              2     0
3      2              1     1
4      2              2     1

哪里value组合person == 1observation_id == 2 df 中缺少的那个已填充值为 0。

data.table 中的等价物是什么? ?

最佳答案

我认为 data.table 的哲学需要比 tidyverse 中找到的任务的特殊命名函数更少,因此需要一些额外的编码,例如:

res = setDT(df)[
  CJ(person = person, observation_id = observation_id, unique=TRUE), 
  on=.(person, observation_id)
]
在此之后,您仍然需要手动处理缺失级别的值的填充。我们可以使用 setnafilldata.table 的最新版本中有效地处理此问题并通过引用:
setnafill(res, fill = 0, cols = 'value')
@Jealie's answer关于将回避这一点的功能。

当然,在这里必须输入三遍列名是很疯狂的。但另一方面,我们可以编写一个包装器:
completeDT <- function(DT, cols, defs = NULL){
  mDT = do.call(CJ, c(DT[, ..cols], list(unique=TRUE)))
  res = DT[mDT, on=names(mDT)]
  if (length(defs)) 
    res[, names(defs) := Map(replace, .SD, lapply(.SD, is.na), defs), .SDcols=names(defs)]
  res[]
} 

completeDT(setDT(df), cols = c("person", "observation_id"), defs = c(value = 0))

   person observation_id value
1:      1              1     1
2:      1              2     0
3:      2              1     1
4:      2              2     1
作为避免在第一步中输入三次名称的快速方法,这是@thelatemail 的想法:
vars <- c("person","observation_id")
df[do.call(CJ, c(mget(vars), unique=TRUE)), on=vars]

# or with magrittr...
c("person","observation_id") %>% df[do.call(CJ, c(mget(.), unique=TRUE)), on=.]
更新:现在您无需在 CJ 中输入两次姓名,感谢 @MichaelChirico 和 @MattDowle the improvement .

关于r - data.table 相当于 tidyr::complete(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43483497/

相关文章:

r - 更新 R Shiny 中的 DT 列过滤器选择

r - 通过分组因子对 data.frame 中的矩阵列表列求和

r - 如果观察在特定时间之前停止,则结转特定值

r - 在 R 中使用 data.table,当标准字段为整数时,一个子集或查询如何?

r - tidyr::expand() 用于跨组的单个列

command-line - R 中的命令行问题

r - 允许 map 上权重重的点压倒其他权重低的点的选项

r - 将合并中的后缀扩展到所有非按列

r - 使用 purrr::walk 从带有动态文件名的嵌套数据帧写入

替换引用命名向量的整个字符串