如何获得具有间隔的每对行的中值

时间:2018-01-04 20:19:08

标签: r

我有一个看起来像这样的数据

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列的中位数

1 个答案:

答案 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