我有一个看起来像这样的 data.frame
df <-data.frame(Day=c(0,0,0,1,1,1),type=c("tr1","tr2","ctrl","tr1","tr2","ctrl"),
mean=c(0.211,0203,0.199,0.119,0.001,0.254),
sd=c(0.07,0.141,0.096, 0.0848, 0.0006, 0.0474))
Day type mean sd
1 0 tr1 0.211 0.0700
2 0 tr2 203.000 0.1410
3 0 ctrl 0.199 0.0960
4 1 tr1 0.119 0.0848
5 1 tr2 0.001 0.0006
6 1 ctrl 0.254 0.0474
首先,我想根据 Day aka group_by(Day) 对我的数据框进行分组。 当在每组中,每种类型(tr1, tr2)的总和(mean + sd)大于 difference(mean - sd) 控件 (ctrl) 然后我想在新列 (new.col) 中赋值 ~yes 如果不是,我想分配值 ~no。
例如,我希望我的数据看起来像这样。它不必看起来像这样
Day type mean sd new.col
1 0 tr1 0.211 0.0700 yes
2 0 tr2 203.000 0.1410 yes
3 0 ctrl 0.199 0.0960 NA
4 1 tr1 0.119 0.0848 NO
5 1 tr2 0.001 0.0006 N0
6 1 ctrl 0.254 0.0474 NA
最佳答案
按“天”分组后,一种选择是对“类型”不是 (!=
) 的“mean”、“sd”值进行子集化 “ctrl”,添加 (+
) 列,得到sum
,检查它是否大于(>
) 'mean', 'sd' 对应的相加值 where “类型”是“ctrl”。通过加 1 将逻辑索引转换为数字索引,将其用于替换值向量 (c("NO", "Yes")
)。最后使用 case_when
NA
library(dplyr)
df %>%
group_by(Day) %>%
mutate(new.col = case_when(type == "ctrl" ~ NA_character_,
TRUE ~ c("NO", "Yes")[1 + (sum(mean[type != "ctrl"] +
sd[type != "ctrl" ]) > (mean[type == 'ctrl'] - sd[type == 'ctrl']))])) %>%
ungroup
-输出
# A tibble: 6 x 5
Day type mean sd new.col
<dbl> <chr> <dbl> <dbl> <chr>
1 0 tr1 0.211 0.07 Yes
2 0 tr2 203 0.141 Yes
3 0 ctrl 0.199 0.096 <NA>
4 1 tr1 0.119 0.0848 NO
5 1 tr2 0.001 0.0006 NO
6 1 ctrl 0.254 0.0474 <NA>
关于r - case_when 在 dplyr R 中有多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68278134/