R 根据不同列(B)中的值向函数中插入条件(A列值)

R 根据不同列(B)中的值向函数中插入条件(A列值),r,tidyverse,tibble,R,Tidyverse,Tibble,这是我之前提出的一个问题()的后续内容。在上下文中,我包含了一些相同的信息 我有一个包含许多列的大型数据框,但相关的列有: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&q

这是我之前提出的一个问题()的后续内容。在上下文中,我包含了一些相同的信息

我有一个包含许多列的大型数据框,但相关的列有: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)) 
df timeX则第一个连续的“XXX”应替换为0.05,第二个连续的“XXX”(或以下所有“XXX”值,如果有更多)应替换为“缺失”

非常重要的是,ID在这里以某种方式分开,因为可能有“XXX”作为一个ID的最终浓度和下一个ID的第一个浓度,我不希望它被解读为单个ID的两个连续“XXX”值

当我们假设timeX=3时,我得到的解决方案是:

require(tidyverse)
df%
变异(浓度=字符(浓度),
浓度(原始=浓度)%>%
变异(浓度=ifelse(浓度='XXX'&时间%)
分组依据(ID)%>%
突变(浓度=ifelse(浓度='XXX'&浓度==铅(浓度)),
“0.05”,如果其他(浓度='XXX',
“缺失”,浓度))%>%
替换_na(list(Concentration=“Missing”)%%>%ungroup()
为了使代码更灵活,更重要的是,不需要用户手动检查时间截止点,然后手动插入,我一直在尝试使代码更自动化


我想代替时间以下是一些可能有用的想法/建议

首先,如果您希望查看
浓度的最大值
,我不希望此列为字符类型。相反,将使其为数字,并使用
NA
查找缺少的值。第一个
mutate
设置该值

分组后,您可以在不同情况下使用
mutate
case\u
。您可以通过以下方式访问最大浓度的
时间

Time[which(Concentration == max(Concentration, na.rm = TRUE))]
(删除缺少的值)

如果
浓度
缺失,且
时间
小于最大浓度的
时间
,则更改为0

在第二种情况下,如果
lead
(或后续行)也丢失,则更改为.05

否则,请勿更改浓度

根据进一步的分析和演示,您可以使用“缺失”作为缺失数据的文本标签

编辑:根据OP评论,似乎只有最长时间后的第一个“XXX”应替换为.05表示浓度,但该时间后的所有以下“XXX”均缺失。为此,添加:

!is.na(lag(Concentration, default = 0))
作为确定值是否应为.05的条件。逻辑是:如果前一行的值不是
NA
,但下一行的值是
NA
,则在最长时间后,更改为.05

以下是修改后的代码:

library(tidyverse)

df %>%
  mutate(Concentration = ifelse(Concentration == "XXX", NA_character_, Concentration),
         Concentration = as.numeric(Concentration)) %>%
  group_by(ID) %>%
  mutate(Concentration_New = case_when(
    is.na(Concentration) & Time < first(Time[which(Concentration == max(Concentration, na.rm = TRUE))]) ~ 0,
    is.na(Concentration) & Time > last(Time[which(Concentration == max(Concentration, na.rm = TRUE))]) & 
      is.na(lead(Concentration, default = 0)) & !is.na(lag(Concentration, default = 0)) ~ .05,
    TRUE ~ Concentration
  ))
库(tidyverse)
df%>%
突变(浓度=ifelse(浓度=“XXX”,NA_字符,浓度),
浓度=数值(浓度))%>%
分组依据(ID)%>%
突变(浓度新=情况)(
is.na(浓度)和时间<第一次(时间[其中(浓度==max(浓度,na.rm=TRUE)))~0,
is.na(浓度)&Time>last(时间[其中(浓度==max(浓度,na.rm=TRUE)))&
is.na(超前(浓度,默认值=0))和is.na(滞后(浓度,默认值=0))~.05,
真浓度
))
输出

      ID Concentration  Time Concentration_New
   <dbl>         <dbl> <dbl>             <dbl>
 1     1          NA       1              0   
 2     1           0.3     2              0.3 
 3     1           0.7     3              0.7 
 4     1           0.6     4              0.6 
 5     1          NA       5             NA   
 6     2          NA       1              0   
 7     2           0.8     2              0.8 
 8     2           0.3     3              0.3 
 9     2          NA       4              0.05
10     2          NA       5             NA   
11     3          NA       1              0   
12     3           0.6     2              0.6 
13     3           0.1     3              0.1 
14     3           0.1     4              0.1 
15     3          NA       5             NA   
ID浓度时间浓度\u新
11NA 10
2     1           0.3     2              0.3 
3     1           0.7     3              0.7 
4     1           0.6     4              0.6 
51NA 5NA
6 2 NA 10
7     2           0.8     2              0.8 
8     2           0.3     3              0.3 
9 2 NA 4 0.05
10 2 NA 5 NA
11 3 NA 10
12     3           0.6     2              0.6 
13     3           0.1     3              0.1 
14     3           0.1     4              0.1 
15 3 NA 5 NA
      ID Concentration  Time Concentration_New
   <dbl>         <dbl> <dbl>             <dbl>
 1     1          NA       1              0   
 2     1           0.3     2              0.3 
 3     1           0.7     3              0.7 
 4     1           0.6     4              0.6 
 5     1          NA       5             NA   
 6     2          NA       1              0   
 7     2           0.8     2              0.8 
 8     2           0.3     3              0.3 
 9     2          NA       4              0.05
10     2          NA       5             NA   
11     3          NA       1              0   
12     3           0.6     2              0.6 
13     3           0.1     3              0.1 
14     3           0.1     4              0.1 
15     3          NA       5             NA