R AVERAGE IF на основе другого значения столбца - включен пример кода - PullRequest
1 голос
/ 29 марта 2020

У меня есть такой фрейм данных:

var1 <- c(1,2,0,1)
var2 <- c(2,0,3,1)
var3 <- c(10,5,10,4)

df <- data.frame(var1,var2,var3)

Итак, я хотел бы, чтобы "усреднение, если" для значений столбца var3 на основе значений каждого var, так что я в конечном итоге с df как этот:

var1   var2
6.33   8

Объяснение: Для var2, если я фильтрую значения больше 0, значения var 3 равны (10,10 и 4), среднее из них равно 8. (24/3)

Таким образом, я усредняю ​​значение var3 для каждого var (var1 и var2), когда они больше 0.

Thx,

1 Ответ

2 голосов
/ 29 марта 2020

Мы можем сделать это индивидуально с помощью summarise

library(dplyr)
df %>% 
   summarise(var1 = mean(var3[var1 >0]), 
              var2 = mean(var3[var2 > 0]))
#      var1 var2
#1 6.333333    8

или с помощью map до l oop над столбцами до filter, а затем получить mean из 'var3' после поднабора на основе условия

library(purrr)
df %>%
   select(var1:var2) %>%
   map_dfc(~ mean(df$var3[.x > 0]))
#       var1 var2
#1 6.333333    8

Или с помощью изменения формы в «длинный» формат, а затем в «широкий»

library(tidyr)
df %>% 
  pivot_longer(cols = -var3) %>%
  filter(value >0) %>% 
  group_by(name) %>%
  summarise(var3 = mean(var3)) %>%
  pivot_wider(names_from = name, values_from = var3)
# A tibble: 1 x 2
#   var1  var2
#  <dbl> <dbl>
#1  6.33     8

или в base R

sapply(df[1:2], function(x) mean(df$var3[x > 0]))
#    var1     var2 
#6.333333 8.000000 

Или другой вариант - изменить значения от 0 до NA, а затем использовать colMeans

colMeans(df$var3* NA^(df[1:2] ==0), na.rm = TRUE)
#   var1     var2 
#6.333333 8.000000 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...