Нахождение столбца Имя по данным в г для 1 - PullRequest
0 голосов
/ 29 ноября 2018

Здесь я хочу добавить столбец (и) в фрейм данных и указать имя столбца, для которого мы нашли 1 в основной таблице.

например,

  1. SrNo 1, у нас есть 1 только для столбца C, поэтому в таблице выходных данных будет только один столбец, и его значение будет равно C.

  2. SrNo 2, у нас есть 1 для столбца Bи D, следовательно, таблица выходных данных должна иметь 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 голосов
/ 29 ноября 2018

Здесь просто получить 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>
0 голосов
/ 29 ноября 2018

Как это?Я удобно оставил «выводную» часть в виде отдельной таблицы.Не стесняйтесь 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...