如何在R中为数据框每列生成值>0的行名字符向量
R批量提取数据框列中数值大于0的行名到独立字符向量
需要处理一个数据框(示例含3列,实际有20列),为每列生成独立的字符向量,每个向量仅包含该列中数值大于0的对应行名。
示例数据框
ex.df <- structure(list( NASQAN2015.147.348 = c(0L, 87L, 0L, 105L, 0L), NASQAN2015.148.348 = c(0L, 57L, 0L, 23L, 21L), NASQAN2015.161.348 = c(17L, 77L, 0L, 146L, 0L) ), row.names = c( "ee866b92e722c35819b112aadc4ac885", "afc0eeec83a181be740331928d883362", "294c12d6881a2ed67aa1557cda9889ff", "466c2c4cb06ba39543c40a74c027008a", "fd0b270adb11f2781450c2e057e50f07" ), class = "data.frame")
预期结果
生成3个以列名为变量名的字符向量,示例如下:
NASQAN2015.147.348 # 字符向量 [1:2] "afc0eeec83a181be740331928d883362" "466c2c4cb06ba39543c40a74c027008a" NASQAN2015.148.348 # 字符向量 [1:3] "afc0eeec83a181be740331928d883362" "466c2c4cb06ba39543c40a74c027008a" "fd0b270adb11f2781450c2e057e50f07" NASQAN2015.161.348 # 字符向量 [1:3] "ee866b92e722c35819b112aadc4ac885" "afc0eeec83a181be740331928d883362" "466c2c4cb06ba39543c40a74c027008a"
已知单列可通过ex.df %>% filter(NASQAN2015.147.348 > 0)处理,但该方法返回数据框,无法批量生成独立向量,以下是可行解决方案:
方法1:基础R实现
用lapply遍历每一列,提取符合条件的行名,再通过list2env将列表元素转为全局环境中的独立向量:
# 生成包含所有结果的列表 result_list <- lapply(ex.df, function(col) rownames(ex.df)[col > 0]) # 将列表中的每个元素转为全局环境中的独立向量(变量名与列名一致) list2env(result_list, envir = .GlobalEnv)
方法2:tidyverse实现
使用purrr包的map函数处理每一列,再转为全局环境变量:
library(tidyverse) # 生成结果列表 result_list <- map(ex.df, ~ rownames(ex.df)[.x > 0]) # 转为独立向量 list2env(result_list, envir = .GlobalEnv)
注意:如果全局环境中已有与列名同名的变量,list2env会直接覆盖该变量,使用前请确认。
验证结果
运行上述代码后,直接调用列名即可得到对应的字符向量:
# 查看其中一个向量 NASQAN2015.147.348
内容的提问来源于stack exchange,提问作者Geomicro
相关产品推荐
相关产品推荐

