使用data.table将表DT1转换为DT2并用二进制填充

问题描述 投票:0回答:1

我有 DT1 并尝试将此表转换为带有 1,0 的 DT2

DT1<-fread("variable    bf_target_N bf_comparator_N
drugA   2   1
drugB   3   4
drugC   4   5
")

DT2<-fread("type    drugA   drugB   drugC
bf_target_N 1   1   1
bf_target_N 1   1   1
bf_target_N 0   1   1
bf_target_N 0   0   1
bf_comparator_N 1   1   1
bf_comparator_N 0   1   1
bf_comparator_N 0   1   1
bf_comparator_N 0   1   1
bf_comparator_N 0   0   1
")

DT2 <- data.table(
  type = c(rep("bf_target_N", nrow(DT1)), rep("bf_comparator_N", nrow(DT1))),
  drugA = rep(0, 2 * nrow(DT1)),
  drugB = rep(0, 2 * nrow(DT1)),
  drugC = rep(0, 2 * nrow(DT1))
)

DT2[type == "bf_target_N", c("drugA", "drugB", "drugC") := .(DT1$bf_target_N, DT1$bf_target_N, DT1$bf_target_N)]
DT2[type == "bf_comparator_N", c("drugA", "drugB", "drugC") := .(DT1$bf_comparator_N, DT1$bf_comparator_N, DT1$bf_comparator_N)]

我尝试了一些这种方式,但未能填充 1,0

r data.table melt dcast
1个回答
1
投票

您可以尝试如下

dcast
+
melt

dcast(
    melt(DT1, id.vars = "variable", variable.name = "type")[,
        .(b = seq_len(value)),
        by = .(variable, type)
    ],
    type + b ~ variable,
    fun = length,
    fill = 0
)[, b := NULL][]

这给出了

              type drugA drugB drugC
1:     bf_target_N     1     1     1
2:     bf_target_N     1     1     1
3:     bf_target_N     0     1     1
4:     bf_target_N     0     0     1
5: bf_comparator_N     1     1     1
6: bf_comparator_N     0     1     1
7: bf_comparator_N     0     1     1
8: bf_comparator_N     0     1     1
9: bf_comparator_N     0     0     1
© www.soinside.com 2019 - 2024. All rights reserved.