如何将列表中的文件子集设置为具有以上特定行数,并在列表中的数据帧上使用函数

  • 本文关键字:列表 函数 数据帧 子集 文件 设置 r
  • 更新时间 :
  • 英文 :


我需要获取一个装满文件的目录,读取它们,删除NA值,然后只保留行数超过一定数量的文件,这些文件将在它们上运行相关性。我已经完成了所有的行的子集,这似乎是我无法管理的。

corr <- function(directory, threshold = 0){
#reads directory of files
file_list <- list.files(path = getwd()

# takes file_list and makes each file into dataframe
dflist <- lapply(file_list, read.csv)

# returns list of files, na rows stripped
nolist <- lapply(dflist, na.omit)
# removes all with nrows < threshold
abovelist <- c()

for(file in nolist){
if (nrow(file) > threshold)
{append(abovelist, file)}
}

# 
}

正如你所看到的,我已经尝试使用for循环,并在这些循环中添加nrow>门槛但每当我尝试运行此步骤时,返回的都是abovelist中的NULL值。我注意到以下与方括号的交互:

> nrow(nolist[1])
NULL
> nrow(nolist[[1]])
117

似乎有些函数访问nolist中的数据帧作为一个单元列表,而另一些函数实际上访问数据帧本身(这就是我在这里想要的(。我如何确保在这里和一般情况下做到这一点?

这里有一个简单的方法:

abovelist <- nolist[sapply(nolist, function(x) nrow(x) > threshold)]

首先,您不是在任何地方分配附加列表,这就是为什么它只是"消失";。此外,我假设您希望将完整的file数据帧附加为列表项,因此必须将其封装在list()中。如果不这样做,您将把所有列作为项附加到abovelist中,我认为这是不希望的行为
因此,要修复您自己的代码,您需要执行以下操作:
if (nrow(file) >= threshold) {abovelist <- append(abovelist, list(file))}

其次,对于你关于R中单括号和双括号[的区别的问题,请看一下这个解释。

最后,这里有一种非常简单的tidyverse处理文件的方法(根本不需要使用for循环、中间列表和逐步追加结果(。

library(dplyr)
library(purrr)
library(readr)
file_list <- list.files(path = getwd(), pattern = '\.csv$')
threshold <- 2
filtered_file_list <- file_list %>%
map(read_csv) %>%
map(na.omit) %>%
keep(~ nrow(.x) > threshold)

最新更新