R数据表如果不存在,则向每个组添加行

kgsdhlau  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(136)

我有一个包含多个组的数据表。如果vals中的值不存在,我希望用包含这些值的行填充每个组。其他列应填充NA。

DT = data.table(group = c(1,1,1,2,2,3,3,3,3), val = c(1,2,4,2,3,1,2,3,4), somethingElse = rep(1,9)) 
vals = data.table(val = c(1,2,3,4))

我想要的:

group val somethingElse
 1:     1   1             1
 2:     1   2             1
 3:     1   3            NA
 4:     1   4             1
 5:     2   1            NA
 6:     2   2             1
 7:     2   3             1
 8:     2   4            NA
 9:     3   1             1
10:     3   2             1
11:     3   3             1
12:     3   4             1

val的阶不一定必须增加,值也可以附加在每个组的开始/结束处。
我不知道如何处理这个问题。我曾想过使用rbindlist(...,fill = TRUE),但这样的话值将被简单地追加。我认为一些DT[, lapply(...), by = c("group")]表达式可能在这里有用,但我不知道如何检查值是否已经存在。

lsmd5eda

lsmd5eda1#

可以使用交叉联接:

setDT(DT)[
  CJ(group = group, val = val, unique = TRUE), 
  on = .(group, val)
]

    group val somethingElse
 1:     1   1             1
 2:     1   2             1
 3:     1   3            NA
 4:     1   4             1
 5:     2   1            NA
 6:     2   2             1
 7:     2   3             1
 8:     2   4            NA
 9:     3   1             1
10:     3   2             1
11:     3   3             1
12:     3   4             1
zsbz8rwp

zsbz8rwp2#

我只想为稍微复杂一点的情况加上这个答案:

#Raw Data
DT = data.table(group = c(1,1,2,2,2,3,3,3,3),
                  x = c(1,2,1,3,4,1,2,3,4),
                  y = c(2,4,2,6,8,2,4,6,8),
                  somethingElse = rep(1,9))

#allowed combinations of x and y
DTxy = data.table(x = c(1,2,3,4), y = c(2,4,6,8))

在这里,我想将DTxy中的所有xy组合添加到DT中的每个组(如果还没有)。
我写了一个函数来处理子集。

#function to join subsets on two columns (here: x,y)
DTxyJoin = function(.SD, xy){
  .SD = .SD[xy, on = .(x,y)]
  return(.SD)
}

然后,我将该函数应用于每个组:

#add x and y to each group if missing
DTres = DT[, DTxyJoin(.SD, DTxy), by = c("group")]

结果:

group x y somethingElse
 1:     1 1 2             1
 2:     1 2 4             1
 3:     1 3 6            NA
 4:     1 4 8            NA
 5:     2 1 2             1
 6:     2 2 4            NA
 7:     2 3 6             1
 8:     2 4 8             1
 9:     3 1 2             1
10:     3 2 4             1
11:     3 3 6             1
12:     3 4 8             1

相关问题