我有一个数据框,我将一个变量放入向量中。
从这个向量,我想计算每5个值mean
,min
和max
的值。
我设法以这种方式计算方法:
means <- colMeans(matrix(df$values, nrow=5))
我知道我可以像这样计算最小值和最大值:
max <- max(df$values[1:5])
min <- min(df$values[1:5])
如何为每个五个值重复此操作?
另外,如何从每个n行的单样本t检验中获得统计值和p值?
答案 0 :(得分:3)
1)tapply g
以下是一个分组变量,由五个,五个二等组成。 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
答案 1 :(得分:2)
您可以使用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)
如果您想要矩阵中的输出,您可以使用评论中提出的@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_list
和statistic_list
每5行为p.value
和statistic
。
答案 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