我有一个很大的数据框,其中包含许多列,但相关的列是: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”值:
我已经尝试过mutate_at和replace_na,一些ifelse语句和case_when,但是我似乎无法弄清楚如何正确地做到这一点。任何帮助将不胜感激!
编辑:只是为了展示一些工作:
df[df == "XXX" & df$Time<3] <- as.numeric(0)
df[df == "BLQ" & df$Time>3] <- as.character("Missing")
我设法找到一种简单而又健壮的解决方案来解决问题的前两个部分,而我所坚持的是最后一个部分-当“时间>”后单个主题有两个或多个连续的“ XXX”值时3。我想我应该在ifelse语句和ID或类似内容的索引列表上循环,但是我不知道该怎么做。在这里以某种方式分隔ID非常重要,因为可能将“ XXX”作为一个ID的最终浓度和作为下一个ID的第一个浓度,我不希望将其作为两个连续的“ XXX”值来读取一个ID。
我使用tidyverse的一些功能解决了该问题,并且还向您的示例添加了其他一些记录。
rm(list = ls(all=TRUE))
require(tidyverse)
df <- data.frame( ID=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,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",0.2,"XXX","XXX",1),
Time=c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,6,7,8,9))
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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句