【发布时间】:2015-03-06 21:15:39
【问题描述】:
我有一个数据框列表
> df.t
[[1]]
column_A start_B stop_C column_D column_E
1 0 23 2 3
1 23 200 1 0
2 0 55 0 1
[[2]]
column_A start_B stop_C column_D column_E
1 0 200 1 0
2 0 20 2 0
2 20 55 0 1
[[3]]
column_A start_B stop_C column_D column_E
1 0 200 0 0
2 0 55 4 2
我想基于column_A进行拆分,并通过column_A、start_B和stop_C合并column_D和column_E。对于每个唯一的 column_A 元素,我想仅使用唯一的 start_B 和 stop_C 元素来查找所有可能的唯一范围组合。例如,在 column_A = 1 的情况下,start_B 和 stop_C 之间唯一的最低到最高范围是 0 - 200,但是 df.t[[1]] 已经从 0 - 23 到 23-200 打破了这个范围。合并后导致这个预期的输出
预期输出:
> df.merge
column_A start_B stop_C column_D column_E
1 0 23 3 3
1 23 200 2 0
2 0 20 6 3
2 20 55 4 4
我知道为了拆分和合并我可以做的两个数据框:
lst1 <- split(df.t[[1]], df.t[[1]]$column_A)
lst2 <- split(df.t[[2]], df.t[[2]]$column_A
require(survival)
df <- do.call(rbind, mapply(FUN = function(x, y) {
x$event <- y$event <- 0
lst1.spl <- survSplit(x, cut=y$stop_C, start='column_A', end='start_B', event='event')
lst2.spl <- survSplit(y, cut=x$stop_C, start='column_A', end='start_B', event='event')
mrg <- merge(lst1.spl, lst2.spl,
by=c('column_A', 'start_B', 'stop_C'))
mrg[c('column_A', 'start_B', 'stop_C', 'column_D', 'column_E')]
},
lst1, lst2, SIMPLIFY=FALSE))
但是,要在数据帧列表上完成此操作,并对 column_D 和 column_E 求和,我认为我应该使用 reduce(),但是我不确定它是否可行或最好的方法!
df.merge = Reduce(function(...) merge(..., by=c('column_A', 'start_B', 'stop_C')), df.t)
这仅按前三列合并,不求和 column_D 和 column_E。我知道我应该使用 ddply,但是我不确定如何正确使用它与 reduce。
谢谢!
【问题讨论】:
-
这里
df.merge我猜是你在Reduce(之后得到的那个,还是预期的输出? -
也许没有 join 和
dplyrdf <- Reduce(rbind, df.t) %>% group_by(column_A, column_B, column_C) %>% summarise_each(funs(sum), column_D, column_E) -
@ckluss 您的代码给出的结果与预期略有不同
-
@user3324491 根据您的输入
df.t,您确定预期结果正确吗?目前尚不清楚您是如何在column_B中获得23 -
我想我仍然不明白你是如何得到你列出的输出的。几个问题:(1)“基于column_A拆分”是什么意思?你是说R的
split函数吗?但这不会改变合并结果。 (2) 举个例子,你能解释一下你是如何在column_D的第 4 行得到一个 4 的吗? (3) 为什么您的预期输出中缺少三个合并列中的某些值组合?例如,1、0、200 发生了什么?
标签: r merge dataframe plyr reduce