我有一个看起来像这样的数据
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 中使用了 Median 函数)
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 列的中位数
首先创建一个拆分因子,用于将数据拆分为 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句