R 以另一个变量的值为条件,通过分组的方式创建一个新变量

R 以另一个变量的值为条件,通过分组的方式创建一个新变量,r,dplyr,R,Dplyr,我想找到创建新变量的最有效方法。假设我有这个数据框: set.seed(1234) df <- data.frame(group = c(rep(1,4), rep(2,4)), X = rep(1:4, 2), G = sample(1:10, 8, replace = T) ) set.seed(1234) df按“组”分组后,根据“X”上的逻辑条件过滤“G”元素,并获得这些值的平均值,以创建带有mutate library(dplyr) df %>% group_by

我想找到创建新变量的最有效方法。假设我有这个数据框:

set.seed(1234)
df <- data.frame(group = c(rep(1,4), rep(2,4)), X = rep(1:4, 2), G = sample(1:10, 8, replace = T) )
set.seed(1234)

df按“组”分组后,
根据“X”上的逻辑条件过滤“G”元素,并获得这些值的
平均值
,以创建带有
mutate

library(dplyr)
df %>%
    group_by(group) %>% 
    mutate(newvar = mean(G[X %in% 1:2]))
# A tibble: 8 x 4
# Groups:   group [2]
#  group     X     G newvar
#  <dbl> <int> <int>  <dbl>
#1     1     1     2    4.5
#2     1     2     7    4.5
#3     1     3     7    4.5
#4     1     4     7    4.5
#5     2     1     9    8  
#6     2     2     7    8  
#7     2     3     1    8  
#8     2     4     3    8  

按“组”分组后,
根据“X”上的逻辑条件过滤“G”元素,并获取这些值的
平均值
,以创建带有
mutate

library(dplyr)
df %>%
    group_by(group) %>% 
    mutate(newvar = mean(G[X %in% 1:2]))
# A tibble: 8 x 4
# Groups:   group [2]
#  group     X     G newvar
#  <dbl> <int> <int>  <dbl>
#1     1     1     2    4.5
#2     1     2     7    4.5
#3     1     3     7    4.5
#4     1     4     7    4.5
#5     2     1     9    8  
#6     2     2     7    8  
#7     2     3     1    8  
#8     2     4     3    8  

哇!这是一个非常好的技巧,
NA^(!X%in%1:2)
。我不知道有一个。@RuiBarradas使用
ave
,我们需要参数具有相同的长度,因此必须求助于一些不常见的参数
ave(替换(df$G,!df$X%in%1:2,NA),df$group,FUN=function(X)mean(X,NA.rm=TRUE))
哇!这是一个非常好的技巧,
NA^(!X%in%1:2)
。我不知道有一个。@RuiBarradas使用
ave
,我们需要参数具有相同的长度,因此必须求助于一些异常的参数
ave(替换(df$G,!df$X%in%1:2,NA),df$group,FUN=function(X)mean(X,NA.rm=TRUE))
df$newvar <- with(df, ave(G * NA^(!X %in% 1:2), group, 
                FUN = function(x) mean(x, na.rm = TRUE)))