r - 如何返回与R中某个条件匹配的列名(首选data.table)?
问题描述
我有一个类似于以下格式的数据集:
每个用户只有一个不是 NA 的变量。我想返回这个 NA 列的列名,如下所示:
逐行编写循环可能很容易解决这个问题,但我想使用 data.table 来生成这个变量。
解决方案
使用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))
推荐阅读
- dynamics-crm - licensetype 枚举的定义是什么?
- javascript - 单击按钮后如何获取数据并限制fetch-es的数量
- sql - mssql:为所有行添加具有相同值的列到搜索结果
- c# - 如何将 EPPlus 中创建的图表导出到图像文件
- asp.net-mvc - Using Business Object As Model is not working?
- python - OpenCV 的这个功能哪里去了?
- firebase - JS函数在promise解析之前返回值
- javascript - 在Interval React.js中乘以数字时如何获得索引0
- javascript - 悬停在父元素上但不影响子元素
- angular - 在 Angular 7 中实现 bcrypt