r - 一次索引并分配多组行

标签 r dataframe indexing set row

我有一个导入的数据框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/

相关文章:

r - 添加 NA 以使所有列表元素等长

Python Multiindex Dataframe 删除最大值

python - 根据变量对字符串进行子集化

python - 如何正确地将小时数添加到 pandas.tseries.index.DatetimeIndex?

Python:如何根据特定元素拆分列表

R:在 ggplot 中按 2 个因子变量进行分层

r - rbind(deparse.level, ...) : numbers of columns of arguments do not match R 中的错误

r - 在Knitr中全局定义图形的控制参数

python - 有没有一种方法可以使用 pandas 进行合并,其中一列是一个列表,而另一列可能包含该列表中的一个元素?

r - 通过 R Shiny 进行逻辑回归