【问题标题】:Loop in R to get specific columns and the sum of the rest from different .csv files在 R 中循环以从不同的 .csv 文件中获取特定列和其余列的总和
【发布时间】:2018-07-10 22:34:50
【问题描述】:

所以我有大约 300 个大型 .csv 文件。我需要获取第 1 列和第 2 列,然后将每个文件的第 3 列和第 20 列相加。最快的方法是什么? 谢谢

【问题讨论】:

  • 根据描述不清楚。你说你想得到第 1 列和第 2 列并且总和列休息?请展示一个可重复的小示例和预期输出\
  • 请阅读how to ask good questions。其他好的参考包括reproducible examplesminimal examples。此外,这些中的每一个都已经在 SO 上回答了许多问题:(1)将许多大型 CSV 文件读入一个列表; (2) 对特定列求和。
  • 除非它是一个非常极端的情况sumcolSums 应该适用于第一部分。要读取许多文件,我建议将它们放在同一个文件夹或同一个文件夹中的文件夹中,然后使用 dirSystem 获取它们的名称等
  • 试试这个:lst<-lapply(filenames,read.csv) 然后lst<-lapply(lst, function(x) cbind(x[1:2],s=rowSums(x[3:20]))),这样可以吗?
  • 是的,抱歉,我不够清楚。以前我是这样做的:d001 <- read.csv(file="d001.csv", header=TRUE, sep=",") transmute(d003,i, j , Flux= h01 + h02 + h03 + h04 + h05 + h06 + h07 + h08 + h09 + h10 + h11 + h12 + h13 + h14 + h15 + h16 + h11 + h22 + h23 + h24) 所以我可以得到一个包含 i、j 和 Flux 列的新数据集,而 Flux 是其余列的总和。我需要对所有 300 个文件执行此操作,然后加入它们,所以我试图找到一个循环但尚未成功;文件很大 (400 mb)

标签: r loops csv


【解决方案1】:

首先将所有文件放在一个文件夹中。

filenames <- list.files(pattern = ".csv")

all <- lapply(filenames, function(name) {
  readr:: read_csv(name)
})

根据您的描述,列表的长度应为 300,每个项目包含一个数据框。如果要绑定所有数据帧的行,可以使用 dplyr 的 bind_rows()。下面是一个基于示例数据集的解决方案,每个数据集有 4 列。

# assumed dataset post importing into a list from step 1
listOfDataFrames <- vector(mode = "list", length = 4)

for (i in 1:4) {
  listOfDataFrames[[i]] <- data.frame(Col1=sample(letters, 5, rep=F),
                                      Col2=rnorm(5), Col3=rnorm(5))
}


all_df <- dplyr::bind_rows(listOfDataFrames)
required_df <- all_df[,1:2]
sum_of_cols <- apply(all_df[,3:4], 2, sum)

===== 根据新信息编辑答案 =====

如果您的所有 csv 文件 d001 到 d300 都在同一个文件夹中,您可以应用我在上面分享的相同原则(我不确定代码的效率,但它应该仍然有效)。
第 1 步:将所有数据帧加载到单个列表中
第 2 步:遍历列表,对所有数据帧(列表的每个元素)执行相同的转换
第 3 步:遍历列表,将列表的每个元素写入单独的 csv 文件

这是一个示例代码:

filenames <- list.files(pattern = ".csv")

all <- lapply(filenames, function(name) {
  readr:: read_csv(name)
})


all_transformed <- lapply(all, function(df) {
  transmute(df, i, j, sum = sum(h01:h24, na.rm = TRUE))
})

names(all_transformed) <- paste0("d",1:length(all_transformed))
lapply(1:length(all_transformed), function(i) write.csv(all_transformed[[i]], 
                                                file = paste0(names(all_transformed[i]), ".csv"),
                                                row.names = FALSE))

【讨论】:

  • 谢谢 Rachit,所以我需要的是:d003 &lt;- read.csv(file="d003.csv", header=TRUE, sep=",") transmute(d003,i, j , Sum= h01 + h02 + h03 + h04 + h05 + h06 + h07 + h08 + h09 + h10 + h11 + h12 + h13 + h14 + h15 + h16 + h11 + h22 + h23 + h24) 然后,我需要对所有这些文件(名称从 d001 到 d300)进行处理并将其放入一个新的 csv 文件中
  • 我已根据此信息编辑了我的答案。希望对您有所帮助。
  • 谢谢!非常有帮助,正是我想要的!尽管如此,我还是不得不手动对 h 求和,因为它给了我这个错误:In h01:h24 : numerical expression has 941017 elements: only the first used 非常感谢!
猜你喜欢
  • 2021-08-04
  • 2014-06-10
  • 2023-03-04
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
相关资源
最近更新 更多