根据多个条件仅替换列中的某些值

浪潮

我有一个很大的数据框,其中包含许多列,但相关的列是: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”值:

  1. 当“时间”列中的值小于或等于3时;“ XXX” == 0
  2. 当“时间”列中的值大于3时;除非时间> 3的单个主题(ID)出现两个连续的“ XXX”值,否则应将“ XXX”替换为单词“ Missing” 然后将第一个连续的“ XXX”替换为0.05,将第二个连续的“ XXX”替换为(如果还有更多,则以下所有“ 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。

Manuzambo

我使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章