R:如何获取每n行的最小值和最大值或其他函数

时间:2017-08-16 13:12:27

标签: r dataframe max min

我有一个数据框,我将一个变量放入向量中。

从这个向量,我想计算每5个值meanminmax的值。

我设法以这种方式计算方法:

means <- colMeans(matrix(df$values, nrow=5))

我知道我可以像这样计算最小值和最大值:

max <- max(df$values[1:5])
min <- min(df$values[1:5])

如何为每个五个值重复此操作?

编辑:

另外,如何从每个n行的单样本t检验中获得统计值和p值?

4 个答案:

答案 0 :(得分:3)

1)tapply g以下是一个分组变量,由五个,五个二等组成。 range提供tapply列表输出的最小值和最大值,然后simplify2array将其减少为数组。如果需要列表输出,请省略simlify2arrayout[1, ]将是最小值,out[2, ]将是最大值。

values <- 1:100 # test input

n <- length(values)
g <- rep(1:n, each = 5, length = n)
out <- simplify2array(tapply(values, g, range))

,并提供:

> out
     1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19  20
[1,] 1  6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91  96
[2,] 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100

2)汇总这也有效:

ag <- aggregate(values, list(g = g), range)

给出这个data.frame,其中第一列是g,第二列是(1)中矩阵的转置。这里ag[[2]][, 1]是最小值,ag[[2]][, 2]是最大值。如果您想要展平ag请尝试do.call(data.frame, ag)do.call(cbind, ag),具体取决于您是否需要3列数据框或矩阵。

> ag
    g x.1 x.2
1   1   1   5
2   2   6  10
3   3  11  15
4   4  16  20
5   5  21  25
6   6  26  30
7   7  31  35
8   8  36  40
9   9  41  45
10 10  46  50
11 11  51  55
12 12  56  60
13 13  61  65
14 14  66  70
15 15  71  75
16 16  76  80
17 17  81  85
18 18  86  90
19 19  91  95
20 20  96 100

答案 1 :(得分:2)

您可以使用sapplysplit

sapply(split(df$value, rep(1:(nrow(df)/5), each=5)), mean)
sapply(split(df$value, rep(1:(nrow(df)/5), each=5)), min)
sapply(split(df$value, rep(1:(nrow(df)/5), each=5)), max)

如果您想要矩阵中的输出,您可以使用评论中提出的@lmo

sapply(split(df$value, rep(1:(nrow(df)/5), each=5)),
                       function(x) c(mean=mean(x), min=min(x), max=max(x)))

更新

如何从每个n行的样本t检验中获取统计值和p值: 这将有点难以实现。看下面;

#mu=3 for sample t-test
t_test_list <- sapply(split(df$value, rep(1:(nrow(df)/5), each=5)), t.test, mu=3) 

p_value_list <- lapply(as.data.frame(t_test_list),function(x) x$p.value)
statistic_list <- lapply(as.data.frame(t_test_list),function(x) x$statistic)

p_value_liststatistic_list每5行为p.valuestatistic

答案 2 :(得分:1)

当然,这是一种非典型的方式,也许不是最有效的,但你可以尝试zoo::rollapply。这为您提供了超出您需要的信息,但您可以过滤到您想要的内容:

vals <- 1:20
zoo::rollapply(vals, 5, function(x) c(min = min(x), max = max(x), mean = mean(x)))[seq(from = 1, to = length(vals), by = 5),]

    min max mean
[1,]   1   5    3
[2,]   6  10    8
[3,]  11  15   13
[4,]  16  20   18

答案 3 :(得分:0)

对于喜欢dplyr并希望保留数据结构的用户,可以使用RcppRoll

 df <- data.frame(
   Time = 1:10,
   Value = sample(100:200, 10)
 )

> df
   Time Value
#1     1   122
#2     2   185
#3     3   138
#4     4   134
#5     5   167
#6     6   197
#7     7   161
#8     8   171
#9     9   152
#10   10   106

现在找到最大值

df%>%mutate(
   ad = RcppRoll::roll_maxr(Value, 3, fill = "0")
 )
   Time Value  ad
#1     1   122   0
#2     2   185   0
#3     3   138 185
#4     4   134 185
#5     5   167 167
#6     6   197 197
#7     7   161 197
#8     8   171 197
#9     9   152 171
#10   10   106 171