R语言 使用ifelse更改我的演算结果

bt1cpqcv  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(122)

我有一个数据集对应于不同的试验,其中测试了不同的治疗。有些试验包括对照组,有些不包括。
以下是一个仅在试验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))

thtygnil

thtygnil1#

我觉得你需要两点纠正-
1.如果你想保持 Dataframe 的长度一致,你需要mutate而不是summarise

  1. "control" %in% treatment给出长度为1的输出。即使你把它改为treatment %in% "control",它仍然会给予不正确的结果,因为条件本身是错误的。
    这里有一个更短的解决方案。
library(dplyr)

data %>%
  group_by(trial) %>%
  mutate(r = value/value[match("control", treatment)])

#  trial treatment value     r
#  <dbl> <chr>     <dbl> <dbl>
#1     1 control    97.2  1   
#2     1 b          99.3  1.02
#3     2 b          85.5 NA   
#4     2 c          85.0 NA

字符串
我们之所以使用match,有两个原因:

  1. match确保您将始终获得1个数字,即使您有两个“控制”trial。即使不太可能,确定一下也是好的。
    1.您可以放弃ifelse,因为如果“control”不存在,match将默认返回NA
    根据新的语法,您可以使用.by-
data %>%
  mutate(r = value/value[match("control", treatment)], .by = trial)

s3fp2yjn

s3fp2yjn2#

@RonakShah解释了为什么你的代码失败,我也更喜欢他的match()解决方案。另一种最小程度修改代码的方法是将ifelse()替换为if...else...

library(dplyr)

data %>%
  group_by(trial) %>%
  mutate(r = if("control" %in% treatment) value/value[treatment == "control"] else NA)

# # A tibble: 4 × 4
# # Groups:   trial [2]
#   trial treatment value     r
#   <dbl> <chr>     <dbl> <dbl>
# 1     1 control    97.2  1   
# 2     1 b          99.3  1.02
# 3     2 b          85.5 NA   
# 4     2 c          85.0 NA

字符串

yc0p9oo0

yc0p9oo03#

这里是一个基本的R解决方案,by

with(data, by(data[-1], trial, \(X) {
  X$value <- X$value/X$value[match("control", X$treatment)]
  X
})) |> array2DF()
#>     trial treatment    value
#> 1       1   control 1.000000
#> 1.1     1         b 1.021605
#> 2       2         b       NA
#> 2.1     2         c       NA

字符串
创建于2023-07-17带有reprex v2.0.2

相关问题