如何获得所有列的每三个行间隔的中位数?

时间:2016-06-30 09:14:48

标签: python r

我有一个包含1600行和13列的庞大数据集,每三行显示一个人的数据,而列则是此人的特征。 我想获得每个人(3行)的所有列的中位数。

例如,从中:

   C1 C2 C3 C4 C5...
R1  1  2  3  4  5
R2  6  7  8  9  1
R3  2  3  4  5  6  
R4  7  6  9  8  3
R5  3  4  6  2  5
R6  9  7  4  3  2
R7  2  5  9  7  6
R8  3  5  8  3  2
R9  9  4  6  5  8

我想得到以下内容:

   C1 C2 C3 C4 C5  
R1  2  3  4  5  5  
R2  7  6  6  3  3  
R3  3  5  8  5  6  

。 。

3 个答案:

答案 0 :(得分:0)

R中,我们使用%/%创建分组变量,然后使用median

获取所有列的summarise_each
 library(dplyr)
 df1 %>% 
    group_by(grp = ((row_number()-1)%/%3)+1) %>%
    summarise_each(funs(median))
 #   grp    C1    C2    C3    C4    C5
 #  <dbl> <int> <int> <int> <int> <int>
 #1     1     2     3     4     5     5
 #2     2     7     6     6     3     3
 #3     3     3     5     8     5     6

或使用data.table

 library(data.table)
 setDT(df1)[, lapply(.SD, median) , .(grp =gl(nrow(df1), 3, nrow(df1)))]
#   grp C1 C2 C3 C4 C5
#1:  1  2  3  4  5  5
#2:  2  7  6  6  3  3
#3:  3  3  5  8  5  6

aggregate

中的base R
aggregate(.~grp, transform(df1, grp = ((1:nrow(df1) -1) %/%3) + 1), median)
#  grp C1 C2 C3 C4 C5
#1   1  2  3  4  5  5
#2   2  7  6  6  3  3
#3   3  3  5  8  5  6

答案 1 :(得分:0)

您可以将数据转换为数组并使用apply

DF <- read.table(text = "   C1 C2 C3 C4 C5
                 R1  1  2  3  4  5
                 R2  6  7  8  9  1
                 R3  2  3  4  5  6  
                 R4  7  6  9  8  3
                 R5  3  4  6  2  5
                 R6  9  7  4  3  2
                 R7  2  5  9  7  6
                 R8  3  5  8  3  2
                 R9  9  4  6  5  8", header = TRUE)

M <- as.matrix(DF)
dim(M) <- c(3, nrow(M)/3, ncol(M))
apply(M, c(2, 3), median)
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    2    3    4    5    5
#[2,]    7    6    6    3    3
#[3,]    3    5    8    5    6

答案 2 :(得分:0)

这是我的尝试。它评估每三个子列表的中值。 中位数是从解压缩子列表的zip中取得的元素之和。

t =[[1, 2, 3, 4, 5], [6, 7, 8, 9, 1], ......

median = lambda subl: list(map(lambda n: sum(n)/len(subl), zip(*subl)))

for i in range(0, len(t), 3):
    print(median(t[i:i+3]))