我有一个看起来像这样的数据
df <- structure(list(time = c(1L, 1L, 1L, 1L, 1L, 1L, 5L, 5L, 5L, 5L,
5L, 5L), grp = c("A", "B", "C", "D", "E", "F", "A", "B", "C",
"D", "E", "F"), `02` = c(36034L, 63763L, 51432L, 65100L, 61444L,
71012L, 266610L, 389787L, 47659L, 63156L, 84593L, 84331L), `03` = c(45632L,
66505L, 60360L, 36685L, 107551L, 53360L, 323952L, 344944L, 69601L,
51268L, 130665L, 59704L), `04` = c(59025L, 52837L, 68571L, 35788L,
75262L, 66601L, 424683L, 340948L, 79487L, 42809L, 95607L, 81739L
), `05` = c(74767L, 48210L, 70972L, 67705L, 85576L, 89265L, 393380L,
306633L, 77816L, 73611L, 106317L, 116890L), `06` = c(50846L,
37970L, 63896L, 78296L, 81216L, 62308L, 62613L, 21770L, 80955L,
88832L, 97586L, 68345L), `07` = c(26688L, 27830L, 17010L, 54074L,
26727L, 31109L, 24448L, 38701L, 17378L, 46327L, 25324L, 25325L
), `08` = c(16498L, 26604L, 41201L, 38417L, 43709L, 33217L, 69943L,
80638L, 37444L, 31701L, 46781L, 31152L), `09` = c(16272L, 24485L,
14546L, 74756L, 28193L, 770L, 72238L, 78418L, 9161L, 48618L,
26466L, 1078L), `10` = c(20612L, 713L, 18114L, 57872L, 25684L,
27985L, 73618L, 1770L, 11953L, 33347L, 25824L, 25860L), `11` = c(23549L,
856L, 32854L, 42906L, 33385L, 26218L, 88509L, 62103L, 23377L,
29738L, 33504L, 26642L)), .Names = c("time", "grp", "02", "03",
"04", "05", "06", "07", "08", "09", "10", "11"), row.names = c(NA,
12L), class = "data.frame")
我想获得前两行的中位数,然后是后两行......但它并不那么容易
我希望获得两行的中位数,当时间为1且grp为A和B时(第3列到第6列)。
然后得到时间为1且grep为C和D(第3列到第6列)的平均值
然后得到时间为1的平均值,grep为E和F(3到6列)
然后在时间为5或任何时间时进行同样的操作
我认为可以通过首先忽略第1列和第2列df[,-c(1,2)]
然后使用行1
然后通过基于第1列的tapply来完成,我不知道如何继续
apply(df[,-c(1,2)], 1, function(x) tapply(x, df[,1], median))
如果我这样做,它会给我两个不好的值
apply(df[1:2,3:6], 1, median)
1 2
52328.5 58300.0
我尝试制作示例输出
预期输出如下(我在xls中使用了中位数函数)
time median 2 to 5 6 to 7 8 to 11
1 A,B 55931 32900 18555
1 C,D 62730 58985 39809
1 E,F 73137 46708.5 28089
5 A,B 342946 184623 72928
5 C,D 66378.5 63641 30719.5
5 E,F 90100 46835 26554
时间很清楚
中间显示哪些行
2至5是第2,3,4和5列的中值
6至7是第6列和第7列的中位数
8至11是第8,9,10和11列的中位数
答案 0 :(得分:3)
首先创建一个拆分因子,用于将数据拆分为2行:我在这里使用了一般视图。但对于这些数据,你可以做rep(1:nrow(dat),each=2)
虽然我包含了其他内容,以便对代码进行概括。
然后使用此操作您的数据如下:
splitfactor=rep(1:ceiling(nrow(dat)),each=2,length=nrow(dat))
dataused=list(3:6,7:8,9:12)
grp=do.call(rbind,by(dat[1:2],splitfactor,function(x) cbind(x[1,1],paste0(x[,2],collapse = ","))))
medians=sapply(dataused,function(x)by(dat[,x],splitfactor,function(m)median(unlist(m))))
data.frame(grp,medians)
X1 X2 X3.6 X7.8 X9.12
1 1 A,B 55931.0 32900.0 18555.0
2 1 C,D 62730.0 58985.0 39809.0
3 1 E,F 73137.0 46708.5 28089.0
4 5 A,B 342946.0 31574.5 72928.0
5 5 C,D 66378.5 63641.0 30719.5
6 5 E,F 90100.0 46835.0 26554.0