【问题标题】:How to apply a function over multiple number of .csv file?如何对多个 .csv 文件应用函数?
【发布时间】:2017-12-28 03:21:34
【问题描述】:

我有大量使用以下结构命名的 csv 文件: df_climate_a_subset_b(a 范围为 1:12,b 范围为 1:1000)。每个文件如下所示:

names<- c("t1","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11")
value1 <- c(2,3.1,4.5,1,6.5,7.1,8.5,9.11,10.1,4,12.3) 
value2 <- c(2.5,3.1,4.5,2,12,7.1,8.5,10,10.1,17.8,12.3) 
value3 <- c(2,3.1,2,5.1,12,7.1,8.5,9.11,10.1,17.8,12.3) 
value4 <- c(1,3.1,4.5,5.1,12,7.1,8.5,1,10.1,17.8,12.3) 

df_climate_1_subset_1 <- data.frame(names,value1,value2,value3,value4)

我还有一个包含 #b 列的文件。

names<- c("t1","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11")
subset1 <- c(5.5,3,4,1,6,7.1,8.5,9.11,10.1,4,12.3) 
subset2 <- c(2.5,3.1,4.5,2.5,12,7.1,8.5,10,10.1,17.8,12.3) 
subset3 <- c(1,1,1.1,8.5,9,10.1,1,1.5,3,2,4) 
subset4 <- c(1,3.1,4.5,0,12,7.1,0,1,10.1,17.8,12.3) 

subsets_temp <- data.frame(names,subset1,subset2,subset3,subset4)

我很难弄清楚什么是获取所有子集的每个 climte 与来自的相应列之间的相关性的有效方法 subsets_temp 数据帧。

最好的

【问题讨论】:

  • 您想如何计算subsets_tempdf_climate_1_subset_1 的单个匹配集的相关性?预期的输出是什么?
  • 只是为了确定。您的单个文件中有“名称”列和 1000 列“subsetX”吗?您在其他文件中有多少列“valueX”(比如 K)?对于给定的“df_climate_a_subset_b”文件,您想要一个“valueX”列与单个文件的特定“subsetb”列之间的相关向量,以便它是 K 值的向量?那么,结果将是一个 12 x 1000 x K 的数组?
  • 对,我的单个文件中的“名称”列和 1000 列“子集b”。我在另一个文件中有四列。我猜是这样,结果将是 12*1000*K 相关系数,但我需要跟踪它们的气候、子集和 K,以便我可以在最后分别绘制它们。 @F.Privé
  • 我想要df_climate_1_subset_1的每一列和subsets_temp的对应列之间的相关系数。当然,这应该对所有 df_climate__subset_ 文件进行...@ChiPak

标签: r dataframe dplyr plyr correlation


【解决方案1】:

做一个可重现的例子:

# example of dataset
df_climate_1_subset_1 <- data.frame(
  names  = c("t1","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11"),
  value1 = c(2,3.1,4.5,1,6.5,7.1,8.5,9.11,10.1,4,12.3),
  value2 = c(2.5,3.1,4.5,2,12,7.1,8.5,10,10.1,17.8,12.3),
  value3 = c(2,3.1,2,5.1,12,7.1,8.5,9.11,10.1,17.8,12.3),
  value4 = c(1,3.1,4.5,5.1,12,7.1,8.5,1,10.1,17.8,12.3) 
)
# one df to compare with (100 subsets, not 1000)
subsets_temp <- data.frame(
  names   = c("t1","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11"),
  subset1 = c(5.5,3,4,1,6,7.1,8.5,9.11,10.1,4,12.3),
  subset2 = c(2.5,3.1,4.5,2.5,12,7.1,8.5,10,10.1,17.8,12.3), 
  subset3 = c(1,1,1.1,8.5,9,10.1,1,1.5,3,2,4),
  subset4 = c(1,3.1,4.5,0,12,7.1,0,1,10.1,17.8,12.3) 
)
for (i in 5:100) {
  subset <- paste0("subset", i)
  subsets_temp[[subset]] <- subsets_temp[["subset4"]]
}
# write some files to the disk (in dir tmp/)
for (a in 1:12) {
  for (b in 1:100) {
    filename <- paste("tmp/df_climate", a, "subset", b, sep = "_")
    write.csv(df_climate_1_subset_1, filename, row.names = FALSE)
  }
}

解决方案: 我想所有文件的名称顺序相同。

library(foreach)

res <- foreach(a = 1:12) %:% 
  foreach(b = 1:100, .combine = "cbind") %do% {
    if (b == 1) print(a)
    filename <- paste("tmp/df_climate", a, "subset", b, sep = "_")
    df <- read.csv(filename)
    subset <- paste0("subset", b)
    cor(df[-1], subsets_temp[[subset]])
  }

这为您提供了一个包含 12 个元素的列表(对应于 a 的每个值)。每个元素是一个 4 * 100 的矩阵。

一开始,我以为我们必须使用并行性(这就是我感兴趣的原因),但它似乎超级快,所以没用。

【讨论】:

  • 感谢您的帮助!它无法在文件中读取!也许我们必须在这里指定 .csv?文件名
  • 是的,您需要根据您的情况稍微调整解决方案。你可以使用paste0("df_climate_", a, "subset_", b, ".csv")
  • 感谢您的帮助! @F。私享
猜你喜欢
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多