在R中构造循环以根据来自data.frame B的列值的匹配子集搜索和替换data.frame A中的值?

问题描述

我有一个原始的“ data.frame A”,其中包含在时程实验中进行的一组测量得出的结果。有对照和测试治疗变量,每种治疗有两只动物,每只动物有3个测量值,第1、2和3天是时间点。

data.frame A

我已经编写了代码生成单独的“ data.frame B”,该数据将许多离群值转换为NA。这些NA与“治疗-动物-测量”列值的特定组合相关。我的目标是使用“ data.frame B”中此类组合值的列表来搜索“ data.frame A”中匹配的个案,并在数据集中的所有时间点上用NA替换value列中的数字。 / p>

data.frame B

我研究了索引,lapply()和for循环来解决此问题,但是在每种情况下都相当早地陷入困境。这是所需的“ data.frame C”的图像,显​​示了我要执行的替换操作:

Resultant "data.frame C"

任何关于最佳行动方案或解决方案的指导,将不胜感激!

解决方法

这是使用dplyr的一种解决方案。确保您的dfb仅包含要更改为NA的行,然后我们将进行左联接和简单的case_when来完成工作。

dfa <- data.frame(
 Treatment = rep(c(rep("Control",6),rep("Test",6)),3),Timepoint = c(rep("Day1",12),rep("Day2",rep("Day3",12)),Animal = rep(c(rep("A",rep("B",3)),Measure = rep(c(c("A1","A2","A3"),c("B1","B2","B3")),Value = c(10,11,9,10,2,rep(10,24))
)

请注意对dfb的微小修改...

dfb <- data.frame(
  Treatment = c("Test","Control"),Animal = c("B","B"),Measure = c("B2","B2"),ReplaceValue = c(TRUE,TRUE)
)

dfb
  Treatment Animal Measure ReplaceValue
1      Test      B      B2         TRUE
2   Control      B      B2         TRUE
library(dplyr)

dfc <- 
  left_join(dfa,dfb,by = c("Treatment","Animal","Measure")) %>%
  mutate(Value = case_when(
    is.na(ReplaceValue) ~ Value,TRUE ~ NA_real_
    )
  ) %>%
  select(-ReplaceValue)
head(dfc,12)
#>    Treatment Timepoint Animal Measure Value
#> 1    Control      Day1      A      A1    10
#> 2    Control      Day1      A      A2    11
#> 3    Control      Day1      A      A3     9
#> 4    Control      Day1      B      B1    10
#> 5    Control      Day1      B      B2    NA
#> 6    Control      Day1      B      B3     9
#> 7       Test      Day1      A      A1    10
#> 8       Test      Day1      A      A2    11
#> 9       Test      Day1      A      A3     9
#> 10      Test      Day1      B      B1    10
#> 11      Test      Day1      B      B2    NA
#> 12      Test      Day1      B      B3     9