这里我想在数据框中添加列,并指定在主表中找到1的列名。
例如
SrNo 1,我们的C列只有1个,因此输出表将只有一列,其值将为C。
SrNo 2,我们的B列和D列有1个,因此输出表应有2个列分别称为Ouput1,Ouput2,并且它们的值分别为B和D。
我能够确定我们可以使用下面的代码来做到这一点,并对所有行循环运行,但是由于性能问题,我不希望这样做。
任何人都有一些完成此任务的好方法
tableA <- data.frame(
SR = 1:5,
A = c(0, 0, 0, 1, 1),
B = c(0, 1, 0, 1, 1),
C = c(1, 0, 1, 1, 0),
D = c(0, 1, 0, 1, 1),
E = c(0, 1, 0, 0, 1))
colnames(tableA)[(which(tableA[1,] == 1))]
表格
输出应类似于:
答案 0 :(得分:2)
这怎么样?我方便地将“输出”部分留为单独的表格。随时自行cbind
。
tableB <- tableA
for (i in 2:ncol(tableB)) {
cn <- colnames(tableB[, i, drop = FALSE])
tableB[, i] <- ifelse(tableB[, i] == 1, cn, "")
}
tableA$final_output <- apply(tableB[, -1], MARGIN = 1, FUN = function(x) {
out <- trimws(paste(x, collapse = ""))
paste(strsplit(out, "")[[1]], collapse = ",")
})
tableA
SR A B C D E final_output
1 1 0 0 1 0 0 C
2 2 0 1 0 1 1 B,D,E
3 3 0 0 1 0 0 C
4 4 1 1 1 1 0 A,B,C,D
5 5 1 1 0 1 1 A,B,D,E
答案 1 :(得分:1)
这里很容易获得FinalOutput
,然后在需要时使用tidyr::separate
获得单个输出。
nn = names(tableA)[-1]
tableA$FinalOutput = apply(tableA[-1] == 1, 1, function(x) paste(nn[x], collapse = ","))
tableA
SR A B C D E FinalOutput
1 1 0 0 1 0 0 C
2 2 0 1 0 1 1 B,D,E
3 3 0 0 1 0 0 C
4 4 1 1 1 1 0 A,B,C,D
5 5 1 1 0 1 1 A,B,D,E
tidyr::separate(tableA,
col = FinalOutput,
into = paste("Output", 1:(ncol(tableA) - 2), sep = "_"),
sep = ",",
remove = FALSE,
fill = "right")
SR A B C D E FinalOutput Output_1 Output_2 Output_3 Output_4 Output_5
1 1 0 0 1 0 0 C C <NA> <NA> <NA> <NA>
2 2 0 1 0 1 1 B,D,E B D E <NA> <NA>
3 3 0 0 1 0 0 C C <NA> <NA> <NA> <NA>
4 4 1 1 1 1 0 A,B,C,D A B C D <NA>
5 5 1 1 0 1 1 A,B,D,E A B D E <NA>