R:通过数据帧和子集循环
我有许多具有相同结构的数据帧(从CSV导入)。我希望遍历所有这些数据帧,并只保留其中的两列 下面的循环似乎不起作用,你知道为什么吗?理想情况下,我希望使用一个循环来实现这一点,因为我正在尝试更好地使用这些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()返回环境中所有对象名称的字符向量,而不是对象本身。要使用
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”包含要操作的所有数据帧的列表,但是循环会给出一个错误,即缺少“参数”子集,在没有默认值的情况下,您可以使用argumentcolClasses
仅读取所需的列。详细信息。建议:rm(list=ls())
后接帧虽然这确实直接回答了您的问题,但我不建议将此策略用于处理多个data.frames。如果它们相似,将它们读入一个公共列表是一个更好的主意。assign
也可能很危险。谢谢。用R以这种方式处理数据似乎很困难,共识是将所有CSV作为一个对象读取。这种方法的问题是,在进行批量操作之前,需要对数据进行预处理。