不同列的条件平均值

  • 本文关键字:条件 平均值 r
  • 更新时间 :
  • 英文 :


我确实有一个像这样的R数据框架:

city2001 <- c('a', 'b', 'a')
grade2001 <- c(5, 5, 7)
city2002 <- c('b', 'b', 'a')
grade2002 <- c(8, 9, 10)
df <- data.frame(city2001, grade2001, city2002, grade2002)

并想返回

avg_a = 7.333
# from (5 + 7 + 10)/3

这个逻辑是怎样的?谢谢。

Try

mean(df[,grepl("grade",colnames(df))][df[,grepl("city",colnames(df))]=="a"])
[1] 7.333333

你的df(列)最好排序。

如果你想为所有的组而不仅仅是"a">

tapply(
unlist(df[,grepl("grade",colnames(df))]),
unlist(df[,grepl("city",colnames(df))]),
mean
)
a        b 
7.333333 7.333333
library(tidyverse)
df %>%
pivot_longer(everything(), names_to = c('.value', 'year'),
names_pattern = '(\D+)(\d+)') %>%
group_by(city)%>%
summarise(mean=mean(grade))
# A tibble: 2 x 2
city   mean
<chr> <dbl>
1 a      7.33
2 b      7.33

这是一个基于R的一行代码,

aggregate(v2 ~ v1, 
cbind.data.frame(v1 = stack(df[c(TRUE, FALSE)])$values, 
v2 = stack(df[c(FALSE, TRUE)])$values), 
mean)
#  v1       v2
#1  a 7.333333
#2  b 7.333333

另一个可能的解决方案:

library(tidyverse)
map(list(df[1:2], df[3:4]), ~ filter(.x, .x[1] == "a") %>% pull(2)) %>% 
unlist %>% mean
#> [1] 7.333333

或者获取每个城市的平均值:

library(tidyverse)
map_dfr(list(df[1:2], df[3:4]), ~ `colnames<-`(.x, c("city", "grade"))) %>%
group_by(city) %>% 
summarise(means = mean(grade))
#> # A tibble: 2 x 2
#>   city  means
#>   <chr> <dbl>
#> 1 a      7.33
#> 2 b      7.33

最新更新