问题描述
我有一个原始的“ data.frame A”,其中包含在时程实验中进行的一组测量得出的结果。有对照和测试治疗变量,每种治疗有两只动物,每只动物有3个测量值,第1、2和3天是时间点。
我已经编写了代码以生成单独的“ data.frame B”,该数据将许多离群值转换为NA。这些NA与“治疗-动物-测量”列值的特定组合相关。我的目标是使用“ data.frame B”中此类组合值的列表来搜索“ data.frame A”中匹配的个案,并在数据集中的所有时间点上用NA替换value列中的数字。 / p>
我研究了索引,lapply()和for循环来解决此问题,但是在每种情况下都相当早地陷入困境。这是所需的“ 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