如何在 R 中构造一个循环以产生条件均值?

How do I construct a loop to make conditional means in R?

提问人:Questionasker 提问时间:11/6/2023 更新时间:11/6/2023 访问量:18

问:

我有一个数据集,其中的观察结果根据优先级进行排名。我想找到一个变量的条件均值(无论他们是否喜欢红色(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'])

这给了我实际值,但我注意到一个关键的区别是,在这里,数字是“引用”的,而不是在循环中它们没有。这会带来什么不同?哪个对我想做的事情是正确的?

谢谢!

R 函数 循环 均值

评论


答:

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
...