【问题标题】:Subset multiple dataframes in a loop in R在R中的循环中子集多个数据帧
【发布时间】:2016-09-25 19:35:39
【问题描述】:

我正在尝试从已导入的 20 多个数据框中删除列。但是,当我尝试遍历所有这些文件时出现错误。当我对单个文件名进行硬编码时,我可以放弃,但是一旦我尝试遍历所有文件,就会出现错误。代码如下:

path <- "C://Home/Data/"
files <- list.files(path=path, pattern="^.file*\\.csv$")

for(i in 1:length(files))
{
  perpos <- which(strsplit(files[i], "")[[1]]==".")
  assign(
    gsub(" ","",substr(files[i], 1, perpos-1)), 
    read.csv(paste(path,files[i],sep="")))
}

mycols <- c("test," "trialruns," "practice")

`file01` = `file01`[,!(names(`file01`) %in% mycols)]

因此,上述内容将起作用并从 file01 中删除这三列。但是,我无法遍历 files02 到 files20 并从所有列中删除列。有任何想法吗?非常感谢!

【问题讨论】:

  • 使用 lapply,将所有数据框保存在一个列表中。例如,请参阅此post
  • 欢迎来到 SO!我们要求您提供一个可重现的示例,而不是在 R 标签中引用您计算机上的文件(您可以使用内置数据集或通过dput() 共享您的代码)。
  • 我认为使用setwd(path)list.files(path = ".", pattern = "^.file.\\csv$", full.names = TRUE) 也会让你的生活更轻松
  • 非常感谢您的回复。 @ zx8754,我正在尝试做:lapply(文件,子集,选择= mycols),但收到一个错误,“缺少参数”子集,没有默认值“。知道可能是什么问题吗?
  • 可能更像 lapply(files, function(x, selcols){x[,selcols]}, mycols)

标签: r file loops subset multiple-columns


【解决方案1】:

正如@zx8754 提到的,考虑lapply() 在一个编译列表中维护所有数据帧,而不是在您的环境中维护多个对象(但下面还包括如何从列表中输出单个dfs):

path <- "C://Home/Data/"
files <- list.files(path=path, pattern="^.file*\\.csv$")
mycols <- c("test," "trialruns," "practice")

# READ IN ALL FILES AND SUBSET COLUMNS
dfList <- lapply(files, function(f) {  
   read.csv(paste0(path, f))[mycols]
})

# SET NAMES TO EACH DF ELEMENT
dfList <- setNames(dfList, gsub(".csv", "", files))

# IN CASE YOU REALLY NEED INDIVIDUAL DFs
list2env(dfList, envir=.GlobalEnv)

# IN CASE YOU NEED TO APPEND ALL DFs
finaldf <- do.call(rbind, dfList)

# TO RETRIEVE FIRST DF
dfList[[1]]  # OR dfList$file01

【讨论】:

  • 非常感谢您的建议。尝试运行此代码时,我得到:“错误:意外符号:“# SET NAMES TO EACH DF ELEMENT dfList”
  • 不知道为什么你会得到这个,因为那是一个评论。与此示例相比,仔细检查您的实现。请注意:mycols 移至顶部。
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 2016-09-25
  • 2021-12-25
  • 2017-07-27
相关资源
最近更新 更多