我有一个包含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
。 。
答案 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]))