首页 > 解决方案 > 如何返回与R中某个条件匹配的列名(首选data.table)?

问题描述

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

在此处输入图像描述

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

在此处输入图像描述

逐行编写循环可能很容易解决这个问题,但我想使用 data.table 来生成这个变量。

标签: rdata.tablena

解决方案


使用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))

推荐阅读