【发布时间】:2020-12-10 10:01:50
【问题描述】:
这是对我之前提出的问题 (Replace only certain values in column based on multiple conditions) 的跟进。对于上下文,我包含了一些相同的信息。
我有一个包含许多列的大型数据框,但相关的是:ID(这是分配给受试者的编号)、时间(进行此受试者测量的时间)和浓度。一个非常简单的例子是:
df <- data.frame( ID=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3),
Concentration=c("XXX",0.3,0.7,0.6,"XXX","XXX",0.8,0.3,"XXX","XXX",
"XXX",0.6,0.1,0.1,"XXX"),
Time=c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5))
我想根据以下条件仅替换浓度列中的“XXX”值:
-
当Time列的值小于等于timeX时; “XXX”==0
-
当Time列的值大于timeX时; “XXX”应替换为单词“Missing”,除非针对 Time>timeX 的单个主题 (ID) 出现两个连续的“XXX”值,然后第一个连续的“XXX”应替换为 0.05并且第二个连续的“XXX”(或所有后续的“XXX”值,如果还有更多)应替换为“Missing”一词。
ID 在这里以某种方式分开非常重要,因为可能有“XXX”作为一个 ID 的最终浓度和作为下一个 ID 的第一个浓度,我不希望将其读取为两个连续的“XXX” " 单个 ID 的值。
当我们假设 timeX=3 时,我的解决方案是:
require(tidyverse)
df <- tibble(df) %>%
mutate(Concentration = as.character(Concentration),
Concentration_Original = Concentration) %>%
mutate(Concentration = ifelse(Concentration == 'XXX' & Time <= 3, "0", Concentration)) %>%
group_by(ID) %>%
mutate(Concentration = ifelse(Concentration == 'XXX' & Concentration == lead(Concentration),
"0.05", ifelse(Concentration == 'XXX',
"Missing", Concentration))) %>%
replace_na(list(Concentration = "Missing")) %>% ungroup()
为了使代码更灵活,更重要的是它不需要用户手动检查时间截止点应该是什么然后手动插入,我一直在尝试使代码更自动化。
我想将 Time timeX 的以下条件: timeX 是时间列中的值对于那个特定的主题 ID,在该列集中的值是最高的。所以基本上条件应该是 timeX 是浓度达到最大值的那个。 例如:对于我的 df 中的 ID 1,最高浓度为 0.7,并且该浓度在 Time = 3 时达到,因此值 3 应插入为 timeX 值。
【问题讨论】: