簡體   English   中英

R AVERAGE IF 基於其他列值 - 包括示例代碼

[英]R AVERAGE IF based on other Column value - Example code included

我有一個這樣的數據框:

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

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

所以,我想要的是根據每個 var 的值對列 var3 值“求平均值”,所以我最終得到了這樣的 df:

var1   var2
6.33   8

說明:對於 var2,如果我過濾大於 0 的值,var 3 的值是 (10,10 和 4),它們的平均值是 8。(24/3)

所以基本上我是在每個 var(var1 和 var2)大於 0 時平均 var3 的值。

謝謝,

我們可以單獨使用summarise來做到這一點

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

或使用map循環遍歷列進行filter ,然后根據條件進行子集化后獲取 'var3' 的mean

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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM