【发布时间】:2021-08-06 07:58:08
【问题描述】:
我有一个 df,我想针对每个唯一 ID 运行 Shapiro 测试,了解它们在 Value 列中的值,并将结果放入数据表 (dt_table) 中。我还编写了几行代码,以便再次用每个唯一 ID 的平均值替换 NA。但我真正想要检查 dt_table 的内容,如果“accept_H1”列为 TRUE,则将 NA 替换为中位数,但如果为 FALSE,则将 NA 替换为平均值
dput(df)
structure(list(ID = c("F1", "F1", "F1", "F1", "F1", "F1", "F1",
"F2", "F2", "F2", "F2", "F2", "F2", "F2", "F2", "F3", "F3", "F3",
"F3", "F3", "F3", "F3", "F3", "F3", "F4", "F4", "F4", "F4", "F4",
"F4", "F4", "F4"), Values = c(9.6, NA, 10.2, 9.8, 9.9, 9.9, 9.9,
1.2, 1.2, 1.8, 1.5, 1.5, 1.6, 1.4, NA, 3266, 3256, 7044, 6868,
NA, 3405, 3410, NA, 5567, 59.4, 56, 52.8, 52.4, 55.5, NA, NA,
53.6)), class = "data.frame", row.names = c(NA, -32L))
这是夏皮罗测试和我放置结果的数据表。
dt_list <- by(df, df$ID, function(sub) {
results <- shapiro.test(sub$Values)
data.table(
ID = sub$ID[1],
Wilk = results$statistic,
p_value = results$p.value,
accept_H1 = results$p.value <= 0.05
)
})
dt_table <- data.table::rbindlist(dt_list)
这些是用每个 ID 的平均值替换所有 NA 的几行代码。我想检查 data_table,例如,如果对于 F1,“accept_H1”列是 TRUE,那么我想用中位数替换 F1 的 NA,但它是 FALSE,然后我想用平均值替换它们。有人可以帮忙吗?
df %>%
group_by(ID) %>%
mutate(Values = ifelse(is.na(Values), mean(Values,na.rm=TRUE), Values))
【问题讨论】: