我在 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/