问题 合并R中的数据帧


嗨,我有很多CSV文件要处理。每个文件都是由一系列算法生成的。 我的数据总是有一个键和一个这样的值:

csv1:

        index value
  1     1     1
  2     2     1
  3     3     1
  4     4     1
  5     5     1

CSV2:

      index value
1     4     3
2     5     3
3     6     3
4     7     3
5     8     3

现在我想聚合这些CSV数据,如下所示:

当两个文件包含相同的密钥时,例如5,结果行应包含密钥,两个文件共享(5)和两个值的平均值((1 + 3)/ 2 = 2)。如果只有一个文件包含密钥(例如2),则该行仅添加到结果表中(key = 2,value = 1)。

像这样的东西:

      index value
1     1     1
2     2     1
3     3     1
4     4     2 (as (1+4)/2 = 2)
5     5     2 (as (1+4)/2 = 2)
6     6     3
7     7     3
8     8     3

起初我想 rbind() 完成工作,但它没有聚合值,只连接数据。我如何用R实现这一目标?


3081
2018-03-21 15:40


起源

rbind, 然后 aggregate - James
您可能只需要在两个单独的步骤中执行此操作 - 1)将值组合到一个结构(使用rbind执行)和2)基于索引的聚合。您可以使用ddply(来自plyr包)或tapply或聚合等方式轻松执行第2步。 - Dason
运用 aggregate(. ~ index, data = rbind(data1,data2), mean) 做我想要的,谢谢! - Matthias B
随意添加它作为您的问题的答案,如果没有其他人给出更好的答案随时接受它。这将有助于其他有类似问题的人更容易找到答案。 - Dason
@elton:Dason所说的是你可以写出自己问题的答案(例如发布你在第3条评论中提到的代码)并接受它;) - digEmAll


答案:


这是一个解决方案。到目前为止,我正在关注所有优秀的评论,希望通过向您展示如何处理任意数量的文件来增加价值。我假设你在同一目录中有你所有的csv文件(my.csv.dir 下面)。

# locate the files
files <- list.files(my.csv.dir)

# read the files into a list of data.frames
data.list <- lapply(files, read.csv)

# concatenate into one big data.frame
data.cat <- do.call(rbind, data.list)

# aggregate
data.agg <- aggregate(value ~ index, data.cat, mean)

修改:在下面的评论中处理您更新的问题:

files     <- list.files(my.csv.dir)
algo.name <- sub("-.*", "", files)
data.list <- lapply(files, read.csv)
data.list <- Map(transform, data.list, algorithm = algo.name)
data.cat  <- do.call(rbind, data.list)
data.agg  <- aggregate(value ~ algorithm + index, data.cat, mean)

13
2018-03-22 00:25



thx这个漂亮的脚本。我下周试试吧! - Matthias B
我还有一个问题。我有多个算法生成这些csv文件。所以我的CSV文件名看起来像这样: algorithm1-values-run1.csv, algorithm1-values-run2.csv, algorithm2-values-run1.csv, algorithm2-values-run2.csv。现在我想读取所有CSV文件,但是通过算法聚合它们。所以我列出了一个列表或类似的东西。它也应该保留算法名称。 - Matthias B
我知道已经两年了但是如果你仍然感兴趣我处理了你的额外请求。请考虑接受我的回答。 - flodel


我从这个问题中理解的是,你想要一个列表,其中包含csv文件或txt文件的data.frame列表并对其进行聚合。

创建一个目录并删除该文件夹中的所有csv和txt文件。 现在运行以下命令以获取列表中的结果。

升= list.files(图案= “CSV”)

这个l对象将包含csv文件的名称

米=地图(read.csv,l)的

此Map函数将read.csv函数映射到所有csv文件,m对象包含csv文件作为list.frame in list。

DAT = do.call(rbind,M)

现在调用plyr库

库(plyr)

RES = ddply(DAT,〜指数,总结,值=平均(值))

此res对象将包含聚合值

我希望这能帮助你获得你渴望的结果。


0
2018-04-25 10:16