嗨,我有很多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实现这一目标?
这是一个解决方案。到目前为止,我正在关注所有优秀的评论,希望通过向您展示如何处理任意数量的文件来增加价值。我假设你在同一目录中有你所有的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)
我从这个问题中理解的是,你想要一个列表,其中包含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对象将包含聚合值
我希望这能帮助你获得你渴望的结果。