【问题标题】:R - extracting column in dataframes of a loopR - 在循环的数据框中提取列
【发布时间】:2017-08-26 16:25:09
【问题描述】:

我需要保存 csv 文件列表,并从每个数据帧的特定列(第二列)的第 13 行中提取值。

这是我的尝试:

temp <- list.files(FILEPATH, pattern="*\\.csv$", full.names = TRUE)

for (i in 1:length(temp)){ 
  assign(temp[i], read.csv(temp[i], header=TRUE, ski[=13, na.strings=c("", "NA")))
  subset(temp[i], select=2) #extract the second column of the dataframe
  temp[i] <- na.omit(temp[i])

但是,这不起作用。一方面,我认为这是因为 read.csv 命令的 skip 参数,因为它显然忽略了标题。另一方面,如果不使用skip,则会弹出如下错误:

subset.default(temp[i], select = 2) 中的错误:参数“子集”为 缺失,没有默认值

当我在subset 命令中插入参数subset=TRUE 时,它不会给出任何错误,但不会执行提取。

任何可能的解决方案?

【问题讨论】:

    标签: r for-loop subset read.csv


    【解决方案1】:

    没有看到文件就不容易分辨,但我会使用lapply,而不是for 循环。也许您可以从以下内容中获得灵感。我使用read.table 因为您skip = 13 行和read.csv 在第一行中读取为列标题。请注意,我避免使用assign

    df_list <- lapply(temp, read.table, sep = ",", skip = 13, na.strings = c("", "NA"))
    names(df_list) <- temp
    col2_list <- lapply(df_list, `[[`, 2)
    col2_list <- lapply(col2_list, na.omit)
    names(col2_list) <- temp
    col2_list
    

    如果您希望 col2_list 成为一个 df 列表,每列只有一列,原始文件的第 2 列,那么,就像我在评论使用中所说的那样

    col2_list <- lapply(df_list, `[`, 2)
    

    并重命名该一列并连续重新编号行

    new_name <- "the_column_of_choice"  #  change this!
    col2_list <- lapply(col2_list, function(x){
                names(x) <- new_name
                row.names(x) <- NULL
                x
            })
    

    【讨论】:

    • 是的,我想避免循环,但我认为我确实需要一个 for 循环,因为我需要对每个数据帧进行进一步操作。
    • @RobertP。但你可以稍后再做,不是吗?您描述的问题类型在没有显式循环/分配的情况下会得到更好的解决。这就是我试图做的。我特别总是尽量避免assign
    • @RobertP。在我的回答中,我忘记了 read.csv 使用的列分隔符。所以我编辑了我的代码以包含参数sep = ","
    • 别担心,我一直在使用read.csv。快速提问 - 我正在测试您的解决方案,但我不知道如何重命名左侧的一列,以及如何将行名设置为递增数字...
    • @RobertP。在lapply(df_list, [[, 2) 中尝试只使用一个[。前者将提取向量,后者将提取子data.frames。如果我理解它,我将需要再次编辑我的答案。请稍等。
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多