R:拆分一列,对每组应用函数并在输出中显示每组的所有列

R: split on one column, apply function on each group and display all columns from each group in the output

我有这样的数据集:`

  > data
   seq desc  id      sample1 sample2 sample3
1 atgc  pqr 123 1.000000e+00       1       1
2 atgc  pqr 123 2.000000e+00       2       2
3  atg   pq  12 1.000000e+00       1       1
4 atgc  pqr 123 3.000000e+00       3       3
5  atg   pq  12 2.000000e+00       2       2
6  atg   pq  12 7.757019e-05       3       3
7  atg   pq  12 1.402031e-05       3       3

我想拆分 'seq' 列的数据并计算每组中所有列的中位数。我想在输出中也显示 desc,id 列。输出应该是这样的:

seq desc  id   sample1 sample2 sample3
1  atg   pq  12 0.5000388     2.5     2.5
2 atgc  pqr 123 2.0000000     2.0     2.0

我试过使用 split&lapply 组合,结果是,

lapply(split_data,function(x)apply(x[,c(4,5,6)],2,median))
$atg
  sample1   sample2   sample3 
0.5000388 2.5000000 2.5000000 

$atgc
sample1 sample2 sample3 
      2       2       2 

使用ddply,

ddply(data,.(seq),function(x)apply(x[,c(4,5,6)],2,median))
   seq   sample1 sample2 sample3
1  atg 0.5000388     2.5     2.5
2 atgc 2.0000000     2.0     2.0

有没有办法将每个组的 desc,id 列包含到最终数据框中以获得上述输出?

假设 descid 在组内没有变化,您可以使用 dplyr

执行以下操作
data %>% 
    group_by(seq, id, desc) %>%
    summarise_each(funs(median))

有了 ddply 你可以使用 colwise

library(plyr)
ddply(data, .(seq, desc, id), colwise(median))
#    seq desc  id   sample1 sample2 sample3
#1  atg   pq  12 0.5000388     2.5     2.5
#2 atgc  pqr 123 2.0000000     2.0     2.0

使用 base R

中的 aggregate
aggregate(.~seq+desc+id, data, median)
#   seq desc  id   sample1 sample2 sample3
#1  atg   pq  12 0.5000388     2.5     2.5
#2 atgc  pqr 123 2.0000000     2.0     2.0

data.table 类似的选项首先需要 'sample' 列的 'class' 与预期输出相似

library(data.table)
setDT(data)[, 4:6 := lapply(.SD, as.numeric), .SDcols=4:6][,
                            lapply(.SD, median), .(seq, desc, id)]
#    seq desc  id   sample1 sample2 sample3
#1: atgc  pqr 123 2.0000000     2.0     2.0
#2:  atg   pq  12 0.5000388     2.5     2.5