r - 使用 dplyr 和 mutate 在相同数据中为数据子集创建变量/列

标签 r dplyr

我在 R 中有一个数据,如下所示

fact_code style_serial mach_smv
1004      style_1200   0.15
1004      style_1200   0
1004      style_1200   0.30
1004      style_1203   0
1004      style_1203   0.22
1004      style_1203   0.18
1008      style_1120   0.25
1008      style_1120   0.25
1008      style_1120   1
1008      style_1121   0.3
1008      style_1121   0
1008      style_1121   0.6

我想为现有数据创建一个变量 avg_mach_smv,当 mach_smv != 0 时,该变量取变量 mach_smv 的平均值>,否则为 NA

下面给出一个例子:

fact_code style_serial mach_smv avg_mach_smv
1004      style_1200   0.15     0.225
1004      style_1200   0        NA
1004      style_1200   0.30     0.225
1004      style_1203   0        NA
1004      style_1203   0.22     0.2
1004      style_1203   0.18     0.2
1008      style_1120   0.25     0.5
1008      style_1120   0.25     0.5
1008      style_1120   1        0.5
1008      style_1121   0.3      0.45
1008      style_1121   0        NA
1008      style_1121   0.6      0.45

用于生成变量的 Stata 代码是:

bysort fact_code: egen sum_nmachines=sum(nmachines) if ss==1

但是,我想知道如何使用 R 生成上面的代码或这个变量。

这是我尝试的第一个代码:

df <- df %>%
select(fact_code, ss, style_serial, machine_name, process_smv, help, 
mach_smv) %>%
group_by(fact_code, style_serial) %>%
filter(mach_smv != 0) %>%
mutate(avg_mach_smv = mean(mach_smv, na.rm = TRUE))

不幸的是,这不是我想要的,因为它丢弃那些 mach_smv == 0 的行,这不是我想要的。

我还尝试了下面的代码,但要么收到错误,要么得到不正确的值:

df2 <- df %>%
select(fact_code, ss, style_serial, machine_name, process_smv, help, 
mach_smv) %>%
group_by(fact_code, style_serial) %>%
mutate(avg_mach_smv = if_else(mach_smv != 0, mean(mach_smv, na.rm = TRUE), 
NA_real_))

df2 <- df %>%
select(fact_code, style_serial, mach_smv) %>%
group_by(fact_code, style_serial) %>%
mutate_at(mach_smv != 0, funs(mean(mach_smv, na.rm = TRUE)))

关于如何创建变量有什么建议吗?

最佳答案

通过 ifelse,我们可以检查 mach_smv==0 条件并采用 mean 忽略 0 值。

library(dplyr)
df %>%
  group_by(fact_code, style_serial) %>%
  mutate(avg_mach_smv = ifelse(mach_smv == 0, NA, mean(mach_smv[mach_smv != 0])))


#   fact_code style_serial mach_smv avg_mach_smv
#       <int> <fct>           <dbl>        <dbl>
# 1      1004 style_1200       0.15        0.225
# 2      1004 style_1200       0           NA    
# 3      1004 style_1200       0.3         0.225
# 4      1004 style_1203       0           NA    
# 5      1004 style_1203       0.22        0.2  
# 6      1004 style_1203       0.18        0.2  
# 7      1008 style_1120       0.25        0.5  
# 8      1008 style_1120       0.25        0.5  
# 9      1008 style_1120       1           0.5  
#10      1008 style_1121       0.3         0.450
#11      1008 style_1121       0           NA    
#12      1008 style_1121       0.6         0.450

关于r - 使用 dplyr 和 mutate 在相同数据中为数据子集创建变量/列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52157871/

相关文章:

python - 如何创建时间重叠的邻接矩阵?

javascript - 单击嵌入 Shiny 的 googlevis 折线图中的图例时如何隐藏系列

r - 从 RStudio : 在 RPub 中发布时出错

R - 使用 rvest 包进行抓取

r - 如何导出S3方法以使其在 namespace 中可用?

r - 总结数据框以包含分组中的所有唯一值

r - 在 dplyr 过滤器中使用 "any"运算符

r - 如何在 R 中使用 plot_grid() 函数绘制多个 seqplots(TraMineR 包)?

r 获取序列的第二次出现

r - dplyr 以及与周围环境重叠的变量名称