【问题标题】:R: Looping through dataframes and subsettingR:循环遍历数据框和子集
【发布时间】:2014-05-02 15:32:56
【问题描述】:

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

下面的循环似乎不起作用,有什么想法吗?理想情况下,我想使用循环来做到这一点,因为我正试图更好地使用这些。

frames <- ls()

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

提前为任何建议喝彩。

【问题讨论】:

  • 1) 它是list,而不是ls; 2)您需要提供索引到框架,如frames[[frame]] &lt;- subset(...); 3)“帧中帧”没有意义,因为您刚刚使用frames &lt;- list() 创建了一个空列表——它应该类似于for (frame in 1:5)
  • 好吧,除非您打算将列表设为ls,否则我不建议这样做
  • ls() 部分工作正常:'frames' 包含要操作的所有数据帧的列表,但是循环给出错误“参数“子集”缺失,没有默认值'
  • 您可以使用参数colClasses 仅读取您想要的列。详情here.
  • 建议:rm(list = ls()) 后跟frames &lt;- lapply(files, read.table),其中files 是文件名向量

标签: r for-loop


【解决方案1】:

对于任何感兴趣的人,我使用了 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))

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 虽然这确实直接回答了您的问题,但我不建议使用这种策略来处理多个 data.frame。如果它们相似,将它们读入一个通用列表是一个更好的主意。
    • assign 也可能很危险。
    • 谢谢。使用 R 以这种方式处理数据似乎很困难,共识是将所有 CSV 作为一个对象读取。这种方法的问题是在进行批量操作之前需要对数据进行预处理。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2018-09-28
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多