R基于其他列值的平均值-包括示例代码

R基于其他列值的平均值-包括示例代码,r,tidyverse,R,Tidyverse,我有这样一个数据帧: var1 <- c(1,2,0,1) var2 <- c(2,0,3,1) var3 <- c(10,5,10,4) df <- data.frame(var1,var2,var3) var1 var2 6.33 8 说明:对于var2,如果我对大于0的值进行过滤,则VAR3的值为(10、10和4),这些值的平均值为8。(24/3) 所以基本上我是平均每个变量(var1和var2)的var3的值,当它们大于0时 Thx,我们可以使用摘要

我有这样一个数据帧:

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

df <- data.frame(var1,var2,var3)
var1   var2
6.33   8
说明:对于var2,如果我对大于0的值进行过滤,则VAR3的值为(10、10和4),这些值的平均值为8。(24/3)

所以基本上我是平均每个变量(var1和var2)的var3的值,当它们大于0时


Thx,

我们可以使用
摘要

library(dplyr)
df %>% 
   summarise(var1 = mean(var3[var1 >0]), 
              var2 = mean(var3[var2 > 0]))
#      var1 var2
#1 6.333333    8
或者使用
map
在列上循环以
filter
,然后在根据条件进行子集设置后获得'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
或者另一个选项是将0的值更改为
NA
,然后使用
colMeans

colMeans(df$var3* NA^(df[1:2] ==0), na.rm = TRUE)
#   var1     var2 
#6.333333 8.000000 

它是否可以推广到var1-var100。这意味着一长串变量。@EGM8686 i添加了4个选项。
colMeans(df$var3* NA^(df[1:2] ==0), na.rm = TRUE)
#   var1     var2 
#6.333333 8.000000