如何返回与R中的特定条件匹配的列名(首选data.table)?

问题描述 投票:0回答:1

我有一个类似于以下格式的数据集:

enter image description here

每个用户只有一个不是NA的变量。我想返回此NA列的列名,如下所示:

enter image description here

逐行编写循环可能会很容易解决此问题,但是我希望用户使用data.table来生成此变量。

r data.table na
1个回答
1
投票

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))
© www.soinside.com 2019 - 2024. All rights reserved.