从r中的数据中查找1的列名

时间:2018-11-29 14:30:00

标签: r

这里我想在数据框中添加列,并指定在主表中找到1的列名。

例如

  1. SrNo 1,我们的C列只有1个,因此输出表将只有一列,其值将为C。

  2. 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))]

表格

enter image description here

输出应类似于:

enter image description here

2 个答案:

答案 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>