如何在数据帧列表中对一列进行分组

时间:2017-01-10 11:40:48

标签: r

我有一个数据框列表。

每个数据框都是按人命名的,每个数据框都包含事件(行)。每个事件的列称为“事件指示”和“活检数量”。我想创建一个摘要数据框(或矩阵?),告诉我每个人为每个指示采取多少活检。

List of 3
 $ :'data.frame':   3 obs. of  2 variables:
  ..$ Indication: Factor w/ 2 levels "AbdoPain","Vomiting": 1 2 1
  ..$ NumOfBx   : num [1:3] 2 3 1
 $ :'data.frame':   4 obs. of  2 variables:
  ..$ Indication: Factor w/ 3 levels "AbdoPain","Anaemia",..: 2 2 1 3
  ..$ NumOfBx   : num [1:4] 12 23 1 5
 $ :'data.frame':   4 obs. of  2 variables:
  ..$ Indication: Factor w/ 3 levels "AbdoPain","Anaemia",..: 2 1 3 3
  ..$ NumOfBx   : num [1:4] 1 2 3 7

结果:

           dfMrBen      dfJohn        dfStuart
Abdo pain
Vomiting
Anaemia

我认为这可能是一个拆分 - 应用 - 合并问题,但我不知道如何结合起来得到如上所述的摘要。目前我有:

ReportOp<-function(x){
#To extract the dataframe name
theName<-x
#To extract the dataframe data
x<-data.frame(Dxlst[[x]])
grp<-x%>% group_by(Indication %>% summarise(mean=mean(NumberOfBx)
}
lapply(names(Dxlst,ReportOp)

但这只是给出了每个数据帧的摘要。我如何组合基本上将数据帧添加到一起以获得预期的结果?

2 个答案:

答案 0 :(得分:1)

首先将数据合并到一个大数据框中,或者在摘要后用

执行此操作
do.call(rbind, Dxlst)

或首先将ID添加到每个列表中,然后rbind将它们组合在一起,如下所示:

Dxlst <- lapply(1:length(Dxlst), 
  function(x) cbind(Dxlst[[x]],
    id = rep(x,nrow(Dxlst[[x]]))))

do.call(rbind, Dxlst)

答案 1 :(得分:0)

不完全是你想要的。但它很接近。此外,您应该组合数据框,然后进行更简单的摘要。

创建数据: -

df1=data.frame(Indication=as.factor(sample(c(0,1), 10, replace = T)), Bx=sample(1:10, 10, replace = T))
df2=data.frame(Indication=as.factor(sample(c(0,1,2), 10, replace = T)), Bx=sample(1:10, 10, replace = T))
l=list(df1,df2)

然后

l=lapply(l, function(x) aggregate( Bx ~ Indication, x, sum))
m=max(sapply(l, nrow))
n=lapply(l, function(x){ x <- x[seq_len(m),]; row.names(x) <- NULL; x})
do.call('cbind',n)

我输出如下:

Indication Bx Indication Bx
1          0 18          0  9
2          1 28          1 35
3       <NA> NA          2 18