применение взвешенного.среднее для определенных значений в столбце

#r

#r

Вопрос:

У меня есть фрейм данных с именем df из пяти столбцов :

 age <- c(10,11,12,12,10,11,11,12,10,11,12)
time <- c(20,26,41,60,29,28,54,24,59,70,25)
weight <- c(123,330,445,145,67,167,190,104,209,146,201)
gender <- c(1,1,2,2,2,2,1,2,2,2,1)
Q2 <- c(112,119,114,120,121,117,116,114,121,122,124)
df <- data_frame(age, w, time, gender, Q2)
 

чего я хочу, так это применения взвешенного значения.среднее значение, основанное на каждом возрасте, для моего фрейма данных с использованием двух условий: 1)gender = 2 and 2) Q2 >=114 amp; Q2 <= 121

с помощью приведенного ниже кода я могу просто применить взвешенный.имею в виду, но я не знаю, как использовать мои два условия.

 df1<-
  df %>% 
  group_by(age) %>% 
  summarise(weighted_time = weighted.mean(time, weight))
 

Ответ №1:

Является ли следующее тем, что вы ищете?

 library(tidyverse)

age <- c(10,11,12,12,10,11,11,12,10,11,12)
time <- c(20,26,41,60,29,28,54,24,59,70,25)
weight <- c(123,330,445,145,67,167,190,104,209,146,201)
gender <- c(1,1,2,2,2,2,1,2,2,2,1)
Q2 <- c(112,119,114,120,121,117,116,114,121,122,124)
df <- data.frame(age, weight, time, gender, Q2)

df %>% 
  group_by(age) %>% 
  filter(gender == 2 amp; Q2 >=114 amp;  Q2 <= 121) %>% 
  summarise(weighted_time = weighted.mean(time, weight), .groups = "drop")

#> # A tibble: 3 × 2
#>     age weighted_time
#>   <dbl>         <dbl>
#> 1    10          51.7
#> 2    11          28  
#> 3    12          42.4
 

Ответ №2:

Вы можете добавить фильтр для этих 2 (3) условий:

df %>% filter(gender == 2 amp; Q2 >= 114 amp; Q2 <= 121) %>% group_by(age) %>% summarise(weighted_time = weighted.mean(time, weight))

Это дает

 # A tibble: 3 x 2
    age weighted_time
  <dbl>         <dbl>
1    10          51.7
2    11          28  
3    12          42.4
 

Ответ №3:

данные.таблица

 age <- c(10,11,12,12,10,11,11,12,10,11,12)
time <- c(20,26,41,60,29,28,54,24,59,70,25)
weight <- c(123,330,445,145,67,167,190,104,209,146,201)
gender <- c(1,1,2,2,2,2,1,2,2,2,1)
Q2 <- c(112,119,114,120,121,117,116,114,121,122,124)
df <- data.frame(age, weight, time, gender, Q2)

library(data.table)
setDT(df)[gender == 2 amp; (Q2 >=114 amp;  Q2 <= 121), list(res = weighted.mean(time, weight)), by = age
          ][order(age)]
#>    age      res
#> 1:  10 51.71739
#> 2:  11 28.00000
#> 3:  12 42.42219
 

Создано 2021-12-10 пакетом reprex (v2.0.1)