Объединение значений логических столбцов в один с приоритетом в R - PullRequest
0 голосов
/ 28 мая 2018

Перешли по ссылкам ниже, но это частично решило мою проблему.

объединение нескольких столбцов ИСТИНА / ЛОЖЬ в один

Объединение матрицы ИСТИНА / ЛОЖЬв один

R: преобразование нескольких логических столбцов в однофакторный столбец

У меня есть кадр данных, который выглядит следующим образом:

dat <- data.frame(Id = c(1,2,3,4,5,6,7,8),
                  A = c('Y','N','N','N','N','N','N','N'),
                  B = c('N','Y','N','N','N','N','Y','N'), 
                  C = c('N','N','Y','N','N','Y','N','N'), 
                  D = c('N','N','N','Y','N','Y','N','N'), 
                  E = c('N','N','N','N','Y','N','Y','N')

)

Я хочу изменить форму моего df с одним столбцом, но он должен давать приоритеты, когда в строке 2 "Y".

Приоритет A> B> C> D> E, что означает, что ихЕсли в A "Y", то результирующее значение должно быть A. Аналогично, в вышеприведенном примере df и C, и D имеет "Y", но в результирующем df должно быть "C".Следовательно, вывод должен выглядеть следующим образом:

resultant_dat <- data.frame(Id = c(1,2,3,4,5,6,7,8),
                  Result = c('A','B','C','D','E','C','B','NA')
)

Я пробовал это:

library(reshape2)

new_df <- melt(dat, "Id", variable.name = "Result")
new_df <-new_df[new_df$value == "Y", c("Id", "Result")]

Но проблема не в том, чтобы обработать приоритет, он создает 2 строки для одного идентификатора.

1 Ответ

0 голосов
/ 28 мая 2018
tmp = data.frame(ID = dat[,1],
                 Result = col_order[apply(
                     X = dat[col_order],
                     MARGIN = 1,
                     FUN = function(x) which(x == "Y")[1])],
                 stringsAsFactors = FALSE)
tmp$Result[is.na(tmp$Result)] = "Not Present"
tmp
#  ID      Result
#1  1           A
#2  2           B
#3  3           C
#4  4           D
#5  5           E
#6  6           C
#7  7           B
#8  8 Not Present
...