我有一个数据集对应于不同的试验,其中测试了不同的治疗。有些试验包括对照组,有些不包括。
以下是一个仅在试验1中存在对照组的示例:
data = data.frame(trial = c(1, 1, 2, 2),
treatment = c("control", "b", "b", "c"),
value = c(97.2, 99.3, 85.51, 85.01))
字符串
当试验包括对照组时,我想得出本试验治疗和本试验对照治疗之间的比值。我首先用一个对照组过滤了所有的试验,效果很好:
data %>%
filter(trial == 1) %>%
group_by(trial) %>%
summarise(treatment = treatment,
r = value / value[which(treatment == "control")])
型
但当我尝试在不过滤试验并使用ifelse()
函数的情况下进行时,我得到了意想不到的结果,比率始终等于1(或NA
,当没有对照组时)。
data %>%
group_by(trial) %>%
summarise(treatment = treatment,
r = ifelse("control" %in% treatment, value / value[which(treatment == "control")], NA))
型
3条答案
按热度按时间thtygnil1#
我觉得你需要两点纠正-
1.如果你想保持 Dataframe 的长度一致,你需要
mutate
而不是summarise
。"control" %in% treatment
给出长度为1的输出。即使你把它改为treatment %in% "control"
,它仍然会给予不正确的结果,因为条件本身是错误的。这里有一个更短的解决方案。
字符串
我们之所以使用
match
,有两个原因:match
确保您将始终获得1个数字,即使您有两个“控制”trial
。即使不太可能,确定一下也是好的。1.您可以放弃
ifelse
,因为如果“control”不存在,match
将默认返回NA
。根据新的语法,您可以使用
.by
-型
s3fp2yjn2#
@RonakShah解释了为什么你的代码失败,我也更喜欢他的
match()
解决方案。另一种最小程度修改代码的方法是将ifelse()
替换为if...else...
字符串
yc0p9oo03#
这里是一个基本的R解决方案,
by
。字符串
创建于2023-07-17带有reprex v2.0.2