【发布时间】:2016-01-22 19:52:09
【问题描述】:
我有一个列表,其中包含与下面生成的对象相对应的多个数据集:
data("AirPassengers"); data("mtcars")
lstDta <- list(dtaCars1 = mtcars, dtaCars2 = mtcars,
dtaCars3 = mtcars, dtaOtherStuff = AirPassengers)
我想合并 row.names
上的 cars 数据集结果
结果应该对应数据框:
res <- merge(
x = merge(x = lstDta$dtaCars1, y = lstDta$dtaCars2, by = "row.names"),
y = lstDta$dtaCars3, by.y = "row.names",
by.x = "Row.names")
使用row.names 连接列的位置(理想情况下,我会删除Row.names 变量,但这不会打扰我):
> dim(res)
[1] 32 34
问题
我想使用Reduce 获得相同的结果,我特别感兴趣:
- 合并
row.names上的数据帧 - 过滤列表。例如,我只想合并 cars 数据而忽略 other 数据集
附加要求
Very useful answer 建议在代码行之外定义一个函数:
merge.all <- function(x, y) { merge(x, y, all=TRUE, by="Sample") } output <- Reduce(merge.all, DataList)
我想避免在Reduce 语法之外定义函数。
尝试
如下图所示,我想把所有东西都塞进Reduce:
dtaMrgd <- Reduce(f = function(x,y) {merge(x,y, by = "row.names")},
lapply(lstDta[grepl("Cars", names(lstDta)) == TRUE]))
所以Reduce 做了两件事:
- 根据匹配的名称使用字符串过滤传递的列表
- 使用过滤后的对象应用具有所需特征的合并功能
针话说,上面的代码失败了。
注意事项
我对 res <- Reduce( ... ) 格式的解决方案特别感兴趣。我对在Reduce() 之外创建一些额外的对象/函数不感兴趣。
【问题讨论】:
标签: r function merge dataframe