R-根据参数 数据

问题描述

我有一个数据帧列表,为了对它们进行单独的统计,我将这些数据帧进行了划分。数据框具有要基于行中的值提取的列的名称。以在df_list中编译的这些数据帧为例:

$df1
  aa bb cc
a  9  9  2
b  9  9  6
c  2 10  5
d  2  9  6
e  3  4  7

$df2
  aa bb cc
a  2  4  3
b  2  8  2
c  6  4  3
d  9  5  8
e  1  5  4

$df3
  aa bb cc
a  1  8  2
b  1  8  9
c  4  1  2
d  9  9  8
e  9  7  3

如果第e行大于5,我想获取列的名称。因此,我将在同一列表或全新列表中获得类似以下的输出

$df1
  [1] "cc" 

$df2
  NULL  #or integer(0),I'm not quite sure what I would see here

$df3
  [1] "aa"    "bb"

我想出了以下代码获取所有列的名称

names_list <- lapply(df_list,function(x) colnames(x))

$df1
[1] "aa" "bb" "cc"

$df2
[1] "aa" "bb" "cc"

$df3
[1] "aa" "bb" "cc"

这是大于5列的代码行:

num_list <- lapply(df_list,function(x) which(x[c("e"),] > 5))

$df1
[1] 3

$df2
integer(0)

$df3
[1] 1 2

尽管最后两个结果令人鼓舞,但我似乎无法将两个想法联系在一起以获得所需的输出。嵌套它们会给我带来我无法识别的无数错误。有可行的方法吗?有没有更有效的方法

解决方法

您需要对数据框的names进行子集设置:

lapply(df_list,function(x) names(x)[x['e',] > 5])
#Similar to OP's attempt. 
#lapply(df_list,function(x) names(x)[which(x[c("e"),] > 5)])

#$df1
#[1] "cc"

#$df2
#character(0)

#$df3
#[1] "aa" "bb"

数据

df_list <- list(df1 = structure(list(aa = c(9L,9L,2L,3L),bb = c(9L,10L,4L),cc = c(2L,6L,5L,7L)),class = "data.frame",row.names = c("a","b","c","d","e")),df2 = structure(list(aa = c(2L,1L),bb = c(4L,8L,4L,5L),cc = c(3L,3L,4L
)),"e"
)),df3 = structure(list(aa = c(1L,1L,9L),bb = c(8L,7L),3L)),"e")))
,

我们可以使用tidyverse

library(dplyr)
library(purrr)
 map(df_list,~  .x %>% 
         rownames_to_column('rn') %>% 
         filter(rn == 'e') %>% 
         pivot_longer(cols = -rn) %>% 
         filter(value > 5) %>%
         pull(name))
#$df1
#[1] "cc"

#$df2
#character(0)

#$df3
#[1] "aa" "bb"

数据

df_list <- list(df1 = structure(list(aa = c(9L,"e")))