У меня есть данные в 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
при mach_smv != 0
, а в противном случае - 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)))
Есть предложения о том, как создать переменную?