R 根据不同列(B)中的值向函数中插入条件(A列值)
这是我之前提出的一个问题()的后续内容。在上下文中,我包含了一些相同的信息 我有一个包含许多列的大型数据框,但相关的列有:ID(分配给受试者的数字)、时间(受试者的测量时间)和浓度。一个非常简单的例子是: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
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