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
转换为“长”格式,然后提取“变量”>
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]
数据
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))