2015-01-08 72 views
0

我dataframes合併列表和不同的列

> 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和sum 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 

我知道爲了拆分和合並只是兩個dataframes我可以這樣做:

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)) 

但是對完成本一個dataframes列表和總和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,但我不知道如何正確使用它與減少。

謝謝!

+0

這裏'df.merge'我猜是你'後減少了('或者是預期的輸出 – akrun

+0

也許沒有加入,與''dplyr' DF <之一 - 減少(rbind,DF。 t)%>%group_by(column_A,column_B,column_C)%>%summarise_each(funs(sum),column_D,column_E)' – ckluss

+0

@ckluss您的代碼與預期結果略有不同 – akrun

回答

1

您的預期輸出與您所做的描述不一致。下面是一些代碼,它們將爲您提供一些column_D和三個數據幀中column_A,column_B和column_C的每個組合的column_E的總和。如果我誤解了你的目標,請告訴我,我會更新。

方法:將三個數據幀合併成一個數據幀,然後按三個分組列對數據進行拆分,然後求和每個組。

library(dplyr) 

# Combine all three data frames into a single data frame 
alldfs = bind_rows(df.t) 

# Sum column_D and column_E for each combination of the grouping columns 
alldfs %>% group_by(column_A, column_B, column_C) %>% 
    summarise(sum_column_D = sum(column_D), 
      sum_column_E = sum(column_E)) 

    column_A column_B column_C sum_column_D sum_column_E 
1  1  0  23   2   3 
2  1  0  200   1   0 
3  1  90  200   1   0 
4  2  0  20   2   0 
5  2  0  55   4   3 
6  2  20  55   0   1 
+0

是的,我忘了補充一點,我想先合併後首先分割column_A。我會更新這個問題。謝謝 – user3324491