data.table::dcast long to wide data while ignoring NA-Category?

data.table::dcast long to wide data while ignoring NA-Category?

我想在一些连接后将我的数据从长数据转换为宽数据,从而在提供的数据中产生一些 NAs。 不幸的是,这些 NA 也存在于 richt-hand 侧 (RHS),它定义了通过转换新添加的列。

考虑这个例子:

library(data.table)

dt <- data.table(id=c(1,2,1,2,3,4),
           group = c("A","A","B","B",NA,NA),
           values = c(7,8,9,10,NA,NA))


dt_wide <- dcast(dt,
                 id ~ group,
                 value.var = c("values"))

在数据中,第 5 行和第 6 行没有任何组或关联值:

   id group values
1:  1     A      7
2:  2     A      8
3:  1     B      9
4:  2     B     10
5:  3  <NA>     NA
6:  4  <NA>     NA

如果有关联值,则组确实存在,因此:(group == NA) => (value == NA)

转换后的数据帧错误地将 NA 视为其在 group- 列中的组,这导致以下宽数据 table:

   id NA  A  B
1:  1 NA  7  9
2:  2 NA  8 10
3:  3 NA NA NA
4:  4 NA NA NA

我不希望构建一个可能存在错误的解决方法,在其中我按名称或值追溯删除 NA 列(因为它可能会在以后的生产中处理不同的列名和列)。

有没有办法告诉 dcast 忽略组中的 NA 并且不从中创建额外的列,同时保留转换后的所有行 table?

像这样:

   id  A  B
1:  1  7  9
2:  2  8 10
3:  3 NA NA
4:  4 NA NA

我认为无法阻止 dcast 这样做。之后我会过滤掉它们:

dt_wide[, names(dt_wide) != "NA", with = FALSE]

输出:

   id  A  B
1:  1  7  9
2:  2  8 10
3:  3 NA NA
4:  4 NA NA

这很棘手,但似乎可行:

dcast(dt,
      id ~ ifelse(is.na(group),unique(na.omit(dt$group)),group),
      value.var = c("values"))

Key: <id>
      id     A     B
   <num> <num> <num>
1:     1     7     9
2:     2     8    10
3:     3    NA    NA
4:     4    NA    NA