【问题标题】:Print processed data from multiple CSV files从多个 CSV 文件打印处理过的数据
【发布时间】:2017-08-26 13:22:06
【问题描述】:

我想处理包含 29 个工作表的 Excel 文件中的数据。 Excel 文件被细分为 29 个 CSV 文件。

我编写的代码为我提供了一个 Excel 文档,其中所有 29 个工作表只有一行。我需要为每个(加载的)工作表(最后 29 行)打印一个摘要。

for (i in 1:length(list.filenames))
{
    list.data[[i]]<-read.csv(list.filenames[i])
    cdata <- ddply(list.data[[i]], c("Year"), summarise, God.Padavine = sum(PRECIPITATION),  N    = length(PRECIPITATION), mean = mean(PRECIPITATION),  sd   = sd(PRECIPITATION), se   = sd *100/mean)
    cdata111 <- ddply(cdata, c(), summarise, God.Padavine1 = sum(God.Padavine)/70,  N    = length(God.Padavine), mean = mean(God.Padavine),  sd   = sd(God.Padavine), se   = sd *100/mean)
    write.xlsx(x = cdata111, file = "test.excelfile111.xlsx", sheetName = "TestSheet", row.names = FALSE)
}

【问题讨论】:

  • 也许可以编辑您的帖子。使用最小的示例而不是整个代码。目前还不太清楚您在寻找什么。一般来说,在 R 中使用 Excel 时,我建议您使用 openxlsx。
  • 我有 29 个 CSV 文件,新 Excel 文件中的程序只写入最后一个 CSV 文件中的值。我想在我的代码和新的 Excel 文件中包含每个 CSV 文件中的所有数据。问题是:如何从每个采购的 CSV 文件中使 Excel 文件成为一行
  • 我意识到我忘记了指导方针:stackoverflow.com/help/mcve 你的代码的问题是你覆盖了你的 xlsx。您只需循环前两行代码。
  • 看起来它可以覆盖......在Excel表格中,它应该逐行添加,他似乎只写在第一行,然后只写最后一张表中的数据
  • for 循环后的矩阵结果全部为 0 元素!!!这是问题!!!

标签: r excel csv


【解决方案1】:

我度过了一个非常忙碌的一周,所以我现在才设法查看您的问题。希望这个答案仍然对您有用:

### 1. Create some example data
example_data=data.frame(Year=rep(1946:1947,each=12),MONTH_ID=rep(1:12,2),PRECIPITATION=round(runif(24,1,100)))
example_data2=data.frame(Year=rep(1948,12),MONTH_ID=1:12,PRECIPITATION=round(runif(12,1,100)))
example_data3=data.frame(Year=rep(1949:1951,each=12),MONTH_ID=rep(1:12,3),PRECIPITATION=round(runif(36,1,100)))
list.data=list(example_data,example_data2,example_data3)

### 2. Loop through the list of data 
cdata=cdata111=list(1:2)
for (i in 1:length(list.data)){                         # replaced list.filenames since I made sample data
    #list.data[[i]]<-read.csv(list.filenames[i])        # Not used because I created sample data
    cdata[[i]] <- ddply(list.data[[i]], c("Year"), summarise, God.Padavine = sum(PRECIPITATION),  N    = length(PRECIPITATION), mean = mean(PRECIPITATION),  sd   = sd(PRECIPITATION), se   = sd *100/mean)
    cdata111[[i]] <- ddply(cdata[[i]], c(), summarise, God.Padavine1 = sum(God.Padavine)/70,  N    = length(God.Padavine), mean = mean(God.Padavine),  sd   = sd(God.Padavine), se   = sd *100/mean)
}

### 3. Write the results
input_summary<-do.call(rbind,cdata111)
yrly_summary<-do.call(rbind,cdata)
write.xlsx(input_summary, file = "Input_summary.xlsx", sheetName = "Input_summary", row.names = FALSE)

对于未来的项目,请注意您的代码存在两个问题:首先,您没有循环通过 cdata111,其次您在循环中使用了 write.xlsx-函数。尤其是后者是不好的做法,因为它会大大减慢你的代码。如果您想做这样的事情,请使用 openxlsx 并在循环之后编写 xlsx after。

如果您将循环的所有结果存储在一个列表中,您可以使用do.call(rbind,mylist) 将所有单独的列表逐行绑定在一起。当然,为此,每个列表项的列必须相同。

【讨论】:

  • @Miljan Jeremic 我还对您的问题进行了编辑。希望如果/当它获得批准时可能会有更多答案
  • 尊敬的同事,感谢您迄今为止的帮助,我从您的示例中学到了很多东西。我在我的网站上上传了一份文件。该文档为 XLSX 格式。如果您没有问题查看文档的数据框,因为我想在一个工作表中获取城市的总值,这些是 29 个工作表。工作表的每个名称都是一个城市,其中包含 1946-2015 年的数据。链接:midusware.wordpress.com/stackoverflow如果你也能看到这些完整的细节……谢谢你的回复!!!
  • 您可以对链接中的数据集使用相同的算法。然后你在加载后拥有list.data 中的每个区域数据集。在list.data 之后,您结束循环并执行tmp &lt;- do.call(cbind, lapply(list.data, function(x) x[,-(1:2)]))。然后使用alldata &lt;- cbind(list.data[[1]][,1:2], tmp) 添加月份和年份数据。完成!
猜你喜欢
  • 2016-04-23
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
相关资源
最近更新 更多