提问人:Questionasker 提问时间:11/6/2023 更新时间:11/6/2023 访问量:18
如何在 R 中构造一个循环以产生条件均值?
How do I construct a loop to make conditional means in R?
问:
我有一个数据集,其中的观察结果根据优先级进行排名。我想找到一个变量的条件均值(无论他们是否喜欢红色(1 或 0))乘以 100 组。也就是说,我想找到前 100 个观测值(按排名)是否像红色一样的平均值。平均值约为 0.25 或类似值。然后,观测值排名是否为 100-200 的平均值与红色相似。然后,200-300,依此类推。总共大约有 18,000 个观测值。
我尝试编写以下循环:
lb <- seq(0, 18000, by = 100)
ub <- lb + 100
redgivenrank <- numeric(length(lb))
for (i in 1:181) {
lb1 <- lb[i]
ub2 <- ub[i]
subset_datans <- subset(datans, datans$rank >= lb1 & datans$rank <= ub2)
redgivenrank[i] <- mean(subset_datans$red, na.rm = TRUE)
}
这最终给了我与手动操作时截然不同的值,然后在几轮之后,它开始给出 NA 值作为答案,所以显然有些不对劲。
手动,我这样做是为了获取值:
mean(datans$red[datans$rank <= '100'])
mean(datans$red[datans$rank >= '100' & datans$rank <= '200'])
mean(datans$red[datans$rank >= '200' & datans$rank <= '300'])
mean(datans$red[datans$rank >= '300' & datans$rank <= '400'])
mean(datans$red[datans$rank >= '400' & datans$rank <= '500'])
这给了我实际值,但我注意到一个关键的区别是,在这里,数字是“引用”的,而不是在循环中它们没有。这会带来什么不同?哪个对我想做的事情是正确的?
谢谢!
答:
0赞
Andrew Gustar
11/6/2023
#1
如果
datans <- data.frame(red = runif(18000))
datans$rank <- rank(datans$red)
那么在基础 R 中,你可以做......
redgivenrank <- tapply(datans$red, floor((datans$rank - 1) / 100), mean)
关于引号的问题,它们将强制将两个变量强制转换为字符串,因此将是一个字母比较,而不是数字比较。如果它们都是 3 位数字,结果恰好相同,但通常最好将数字保留为数字!>
0赞
Jon Spring
11/6/2023
#2
library(dplyr)
set.seed(42)
data.frame(red = runif(18000)) |>
mutate(rank = min_rank(red),
group = ceiling(rank/100)*100) |>
arrange(group) |>
summarize(mean = mean(red), .by = group)
结果
group mean
1 100 0.002669958
2 200 0.007938085
3 300 0.013000659
4 400 0.018663290
5 500 0.024165192
6 600 0.029287301
7 700 0.034077178
8 800 0.039054385
9 900 0.044447559
10 1000 0.049864560
...
评论