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 列包含到最终数据框中以获得上述输出?
假设 desc
和 id
在组内没有变化,您可以使用 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
我有这样的数据集:`
> 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 列包含到最终数据框中以获得上述输出?
假设 desc
和 id
在组内没有变化,您可以使用 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