R:通过数据帧和子集循环

R:通过数据帧和子集循环,r,for-loop,R,For Loop,我有许多具有相同结构的数据帧(从CSV导入)。我希望遍历所有这些数据帧,并只保留其中的两列 下面的循环似乎不起作用,你知道为什么吗?理想情况下,我希望使用一个循环来实现这一点,因为我正在尝试更好地使用这些 frames <- ls() for (frame in frames){ frame <- subset(frame, select = c("Col_A","Col_B")) } frames基本问题是ls()返回环境中所有对象名称的字符向量,而不是对象本身。要使用

我有许多具有相同结构的数据帧(从CSV导入)。我希望遍历所有这些数据帧,并只保留其中的两列

下面的循环似乎不起作用,你知道为什么吗?理想情况下,我希望使用一个循环来实现这一点,因为我正在尝试更好地使用这些

frames <- ls()

for (frame in frames){ 
frame   <- subset(frame, select = c("Col_A","Col_B"))
 }

frames基本问题是ls()返回环境中所有对象名称的字符向量,而不是对象本身。要使用包含对象名称的字符变量获取和替换对象,可以使用get()/assign()函数。您可以将函数重新编写为

frames <- ls()

for (frame in frames){ 
    assign(frame, subset(get(frame), select = c("Col_A","Col_B")))
}

frames对于任何感兴趣的人,我使用了Richard Scriven的想法,将数据帧作为一个对象读取,并添加了一个显示文件从何处导入的函数。这使我可以使用Plyr包来处理数据:

library(plyr)

dataframes <- list.files(path = TEESMDIR, full.names = TRUE)

## Define a function to add the filename to the dataframe

read_csv_filename <- function(filename){
  ret <- read.csv(filename)
  ret$Source <- filename #EDIT
  ret
}

list_dataframes <- ldply(dataframes, read_csv_filename)

selection <- llply(list_dataframes, subset, select = c(var1,var3))
库(plyr)

数据帧1)它是
列表
,而不是
ls
;2) 您需要为frame提供索引,就像在
frames[[frame]]中一样,除非您打算将列表设置为
ls
,我不建议这样ls()部分工作正常:“frames”包含要操作的所有数据帧的列表,但是循环会给出一个错误,即缺少“参数”子集,在没有默认值的情况下,您可以使用argument
colClasses
仅读取所需的列。详细信息。建议:
rm(list=ls())
后接
帧虽然这确实直接回答了您的问题,但我不建议将此策略用于处理多个data.frames。如果它们相似,将它们读入一个公共列表是一个更好的主意。
assign
也可能很危险。谢谢。用R以这种方式处理数据似乎很困难,共识是将所有CSV作为一个对象读取。这种方法的问题是,在进行批量操作之前,需要对数据进行预处理。