【问题标题】:dcast function with binary values and NA具有二进制值和 NA 的 dcast 函数
【发布时间】:2018-12-27 16:04:51
【问题描述】:

我想用 dcast 更改我的 data.table 中的列,但我不希望它是二进制值 (0/1) 或不在级别中时

例如这个data.table:

dt1 <- data.table::data.table("ID" = 1:4,'Col0' = c(1, 0, 1, 0),'Col1' = c('a', 'b', 'c', 'a'),'Col2' = (letters[20:23]),'Col3' = factor(c("a", "b", NA, "a"),levels = c("a", "b", "c")))

我在尝试 dcast 之前添加了 ID,但我们可以移动这个值

我试过这个,但就像我在遇到关卡和二进制问题之前所描述的那样。

res = data.table::dcast(data.table::melt(dt1, id.vars='ID'), ID ~ variable + value, fun = length)

我试图得到这个结果。

result <- data.table::data.table('Col0' =  c(1, 0, 1, 0),'Col1_a' = c(1, 0, 0, 1),'Col1_b' = c(0, 1, 0, 0),'Col1_c' = c(0, 0, 1, 0),'Col2_t' = c(1, 0, 0, 0),'Col2_u' = c(0, 1, 0, 0),'Col2_v' = c(0, 0, 1, 0),'Col2_w' = c(0, 0, 0, 1), 'Col3_a' = c(1, 0, NA, 1),'Col3_b' = c(0, 1, NA, 0))

【问题讨论】:

  • 可以以dummies::dummy.data.frame(dt1, names = colnames(dt1)[!sapply(dt1, is.numeric)], sep = "_")或fastDummies::dummy_cols(dt1)开头

标签: r


【解决方案1】:

这里有一些替代方案:

1) model.matrix 函数mm 定义基于列nm 添加NA 作为级别的模型矩阵。将其应用于除ID 之外的每一列,并删除那些全为零或名称中包含NA 的列。

mm <- function(nm) model.matrix(~.-1, setNames(list(addNA(dt1[[nm]])), nm))
res <- do.call("cbind", lapply(names(dt1)[-1], mm))
res[, colSums(res) > 0 & !grepl("NA", colnames(res)) ]

给予:

  Col00 Col01 Col1a Col1b Col1c Col2t Col2u Col2v Col2w Col3a Col3b
1     0     1     1     0     0     1     0     0     0     1     0
2     1     0     0     1     0     0     1     0     0     0     1
3     0     1     0     0     1     0     0     1     0     0     0
4     1     0     1     0     0     0     0     0     1     1     0

2) melt/dcast 使用 data.table 中的 melt 和 dcast 将每列转换为因子,最后删除名称中包含 NA 的列。

m <- melt(replace(dt1, TRUE, lapply(dt1, factor)), id.vars='ID')
res = dcast(m, ID ~ variable + value, fun = length)
subset(res, select = !grepl("NA", colnames(res)) )[, -1]

给予:

   Col0_0 Col0_1 Col1_a Col1_b Col1_c Col2_t Col2_u Col2_v Col2_w Col3_a Col3_b
1:      0      1      1      0      0      1      0      0      0      1      0
2:      1      0      0      1      0      0      1      0      0      0      1
3:      0      1      0      0      1      0      0      1      0      0      0
4:      1      0      1      0      0      0      0      0      1      1      0

【讨论】:

  • 谢谢我通过你的 2 方法得到我的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多