我有一个导入的数据框Measurements
,其中包含来自实验的许多观察结果。
Measurements <- data.frame(X = 1:4,
Data = c(90, 85, 100, 105))
X Data
1 90
2 85
3 100
4 105
我想添加另一列条件
来指定每个数据点的治疗组。我知道哪个观察范围来自哪个条件(例如,观察 1:2
来自对照组,观察 3:4
来自实验组)。
我已经设计了两种解决方案,可以提供所需的输出,但都不理想。第一:
Measurements["Condition"] <- c(rep("Cont", 2), rep("Exp", 2))
X Data Condition
1 90 Cont
2 85 Cont
3 100 Exp
4 105 Exp
这样做的好处是它是一行代码/一个命令。但这并不理想,因为我需要在外部单独进行数学计算(例如 3:4 = 2 obs 等),对于更大的数据集和更多条件(例如 47:83),这可能会棘手/不清楚/间接 = ? obs 等),并且可能会导致永久错误,因为早期分配的长度上的小错误也会改变后面组的分配(例如,如果 Cont 的代表错误地为 1,则 Exp也被错误地分配为 2:3)。
我也想过这样分配,这也给出了所需的输出:
Measurements[1:2, "Condition"] <- "Cont"
Measurements[3:4, "Condition"] <- "Exp"
X Data Condition
1 90 Cont
2 85 Cont
3 100 Exp
4 105 Exp
这使得哪些行将接收哪个分配更加清晰/简单/直接,但这需要单独的分配和重复。我觉得应该有一种方法来“矢量化”这项作业,这就是我正在寻找的解决方案。
我无法从网上找到复杂的索引规则。这是我对如何实现这一目标的第一个直观猜测:
Measurements[c(1:2, 3:4), "Condition"] <- list("Cont", "Exp")
X Data Condition
1 90 Cont
2 85 Cont
3 100 Cont
4 105 Cont
但这行不通。它似乎将 1:2 和 3:4 组合成一个等效范围 (1:4),并仅将第一个条件分配给该范围,这表明我还需要再次指定该列。当我尝试再次指定该列时:
Measurements[c(1:2, 3:4), c("Condition", "Condition")] <- list("Cont", "Exp")
X Data Condition Condition.1
1 90 Cont Exp
2 85 Cont Exp
3 100 Cont Exp
4 105 Cont Exp
出于某种原因,这会创建第二个新列 (??),并且它似乎再次将 1:2 和 3:4 组合成本质上的 1:4。因此,我认为我需要以一种使它们分离的方式对两行范围建立索引,并且只指定一次列,但我一直不知道如何做到这一点。我认为解决方案很简单,但我似乎找不到我想要做的事情的例子。也许为了让它们分开,我必须单独分配它们,但我希望有办法。
有人可以帮忙吗?提前非常感谢 R 新手!
最佳答案
如果您已经有了属于每个条件的观察列表,您可以使用 dplyr::case_when 来进行条件变异。根据您存储此信息的方式,您可以使用如下内容:
library(dplyr)
Measurements <- data.frame(X = 1:4,
Data = c(90, 85, 100, 105))
# set which observations belong to each condition
Cont <- 1:2
Exp <- 3:4
Measurements %>%
mutate(Condition = case_when(
X %in% Cont ~ "Cont",
X %in% Exp ~ "Exp"
))
# X Data Condition
# 1 90 Cont
# 2 85 Cont
# 3 100 Exp
# 4 105 Exp
请注意,这不要求观察结果位于连续的行中。
关于r - 一次索引并分配多组行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65415349/