Как вернуть имя столбца, которое соответствует определенному условию в R (предпочитаете data.table)? - PullRequest
1 голос
/ 15 марта 2020

У меня есть набор данных, подобный следующему формату:

enter image description here

У каждого пользователя есть только одна переменная, которая не является NA. Я хочу вернуть имя столбца этого столбца NA следующим образом:

enter image description here

Запись al oop по строкам может легко решить эту проблему, но я хотите, чтобы пользователь data.table генерировал эту переменную.

1 Ответ

3 голосов
/ 15 марта 2020

С base R, это будет более эффективно

df1$NonNA_VarName <- names(df1)[-1][max.col(!is.na(df1[-1]), 'first')]
df1$NonNA_VarName
#[1] "v1" "v2" "v1" "v3" "v4" "v3"

С data.table, опцией является melt в формате 'long' и затем извлечение 'variable

library(data.table)
melt(setDT(df1), id.var = 'user',  na.rm = TRUE)[,
       .(NonNA_VarName = first(variable)), user][df1, on = .(user)]

Или другой вариант - сгруппировать по «пользователю» и использовать which.max для возврата индекса

setDT(df1)[,  NonNA_VarName := names(.SD)[which.max(unlist(.SD))], by = user]

data

df1 <- structure(list(user = 1:6, v1 = c(3, NA, 2, NA, NA, NA), v2 = c(NA, 
5, NA, NA, NA, NA), v3 = c(NA, NA, NA, 5, NA, 7), v4 = c(NA, 
NA, NA, NA, 4, NA)), class = "data.frame", row.names = c(NA, 
-6L))
...