R:如何取每n行的min和max或其他函数
R: How to take the min and max or other functions of every n rows
我有一个数据框,我将其中一个变量放入一个向量中。
从这个向量中,我想计算每 5 个值 mean
、min
和 max
值。
我是这样算出来的:
means <- colMeans(matrix(df$values, nrow=5))
我知道我可以这样计算最小值和最大值:
max <- max(df$values[1:5])
min <- min(df$values[1:5])
如何对每五个值重复此操作?
编辑:
此外,如何从每个 n 行的 1 样本 t 检验中获取统计数据和 p 值?
您可以为此使用 sapply
和 split
:
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)
如果您想要矩阵中的输出,您可以使用 在评论中提出的建议:
sapply(split(df$value, rep(1:(nrow(df)/5), each=5)),
function(x) c(mean=mean(x), min=min(x), max=max(x)))
更新
How to get statistic and p-value from a sample t-test for each n-row:这会有点更难实施。往下看;
#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_list
和statistic_list
是每5行p.value
和statistic
。
1) tapply 下面g
是一个分组变量,由fives ones,fives twos等等组成。 range
提供从 tapply
生成列表输出的最小值和最大值,然后 simplify2array
将其缩减为数组。如果您想要列表输出,请省略 simlify2array
。 out[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
当然是一种非典型的方法,而且可能不是最有效的,但您可以尝试 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
喜欢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
我有一个数据框,我将其中一个变量放入一个向量中。
从这个向量中,我想计算每 5 个值 mean
、min
和 max
值。
我是这样算出来的:
means <- colMeans(matrix(df$values, nrow=5))
我知道我可以这样计算最小值和最大值:
max <- max(df$values[1:5])
min <- min(df$values[1:5])
如何对每五个值重复此操作?
编辑:
此外,如何从每个 n 行的 1 样本 t 检验中获取统计数据和 p 值?
您可以为此使用 sapply
和 split
:
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)
如果您想要矩阵中的输出,您可以使用
sapply(split(df$value, rep(1:(nrow(df)/5), each=5)),
function(x) c(mean=mean(x), min=min(x), max=max(x)))
更新
How to get statistic and p-value from a sample t-test for each n-row:这会有点更难实施。往下看;
#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_list
和statistic_list
是每5行p.value
和statistic
。
1) tapply 下面g
是一个分组变量,由fives ones,fives twos等等组成。 range
提供从 tapply
生成列表输出的最小值和最大值,然后 simplify2array
将其缩减为数组。如果您想要列表输出,请省略 simlify2array
。 out[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
当然是一种非典型的方法,而且可能不是最有效的,但您可以尝试 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
喜欢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