- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨堆栈溢出社区,
我是 R 的新手(9 个月),这是我第一个关于 reprex 的堆栈溢出问题,非常感谢任何帮助。尽管我对基础 R 解决方案持开放态度,但我主要使用 tidyverse。
问题:
我有大约 21,000 行症状数据,每天有 >10 个变量。我希望能够通过使用规则来定义发作的开始和结束来对疾病的“恶化”(在这种情况下为肺部疾病的胸部感染)进行分类,以便我以后可以计算发作的持续时间,发作的类型(这取决于症状的组合)和接受的治疗。与任何涉及患者的数据集一样,存在缺失值。如果缺少不到 2 天的数据,我会从最近一天算起。
以下代码是一个简化的虚构示例,仅涉及一种症状。
恶化规则:恶化开始 = 症状恶化 2 天 (>= 3)缓解恶化 = 5 天正常呼吸 (<=2)
理想情况下,我希望能够确定恶化正在发生的所有日子。
数据如下:
#load packages
library(tidyverse)
#load data
id <- "A"
day <- c(1:50)
symptom <- c(2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,NA,NA,NA,2,2,2,3,3,3,4,4,3,3,2,3,2,2,3,3,2,2,2,2,2,2,3,2,2,2,2,2,3,2,2)
df <- data.frame(id,day,symptom)
#Data Dictionary
#Symptom: 1 = Better than usual, 2 = Normal/usual, 3 = Worse than usual, 4 = Much worse than usual
我尝试过的:
我试图通过结合使用 lag() 和 lead() 以及条件语句 case_when() 和 ifelse() 来解决这个问题。
df %>%
mutate_at(vars("symptom"), #used for more variables within vars() argument
.funs = list(lead1 = ~ lead(., n = 1),
lead2 = ~ lead(., n = 2),
lead3 = ~ lead(., n = 3),
lead4 = ~ lead(., n = 4),
lead5 = ~ lead(., n = 5),
lag1 = ~ lag(., n = 1),
lag2 = ~ lag(., n = 2),
lag3 = ~ lag(., n = 3))) %>%
mutate(start = case_when(symptom <= 2 ~ 0,
symptom >= 3 ~
ifelse(symptom >= lag2 & symptom <= lag1,1,0)),
end = case_when(symptom >=3 ~
ifelse(lead1 <=2 &
lead2 <=2 &
lead3 <=2 &
lead4 <=2 &
lead5 <=2,1,0)))
我的主要问题是复杂性。随着我构建更多的症状和规则,我必须引用其中包含 ifelse()/case_when() 语句的不同变量。我确信我的问题有更优雅的解决方案。
另一个问题是,在“恶化”期间,exacerbation_start 变量应该只在开始时使用,而不是在发作期间使用。与 exacerbation_end 类似,它仅适用于已经发生恶化的情况。我曾尝试使用 ifelse() 语句来指代病情恶化的时间,但无法让它发挥作用并遵守我想要的规则。
我想要的输出是:
id day symptom start end exacerbation
1 A 1 2 0 0 0
2 A 2 2 0 0 0
3 A 3 2 0 0 0
4 A 4 2 0 0 0
5 A 5 2 0 0 0
6 A 6 2 0 0 0
7 A 7 2 0 0 0
8 A 8 2 0 0 0
9 A 9 2 0 0 0
10 A 10 2 0 0 0
11 A 11 2 0 0 0
12 A 12 3 0 0 0
13 A 13 2 0 0 0
14 A 14 2 0 0 0
15 A 15 2 0 0 0
16 A 16 2 0 0 0
17 A 17 NA 0 0 0
18 A 18 NA 0 0 0
19 A 19 NA 0 0 0
20 A 20 2 0 0 0
21 A 21 2 0 0 0
22 A 22 2 0 0 0
23 A 23 3 0 0 0
24 A 24 3 1 0 1
25 A 25 3 0 0 1
26 A 26 4 0 0 1
27 A 27 4 0 0 1
28 A 28 3 0 0 1
29 A 29 3 0 0 1
30 A 30 2 0 0 1
31 A 31 3 0 0 1
32 A 32 2 0 0 1
33 A 33 2 0 0 1
34 A 34 3 0 0 1
35 A 35 3 0 1 1
36 A 36 2 0 0 0
37 A 37 2 0 0 0
38 A 38 2 0 0 0
39 A 39 2 0 0 0
40 A 40 2 0 0 0
41 A 41 2 0 0 0
42 A 42 3 0 0 0
43 A 43 2 0 0 0
44 A 44 2 0 0 0
45 A 45 2 0 0 0
46 A 46 2 0 0 0
47 A 47 2 0 0 0
48 A 48 3 0 0 0
49 A 49 2 0 0 0
50 A 50 2 0 0 0
期待您的回复!
编辑
我又添加了 50 行数据来模拟多次恶化以及右删失和 NA 的问题。我还包括了第二个参与者“B”,看看这是否是问题的原因。
id <- c("A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A",
"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A",
"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A",
"B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B",
"B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B",
"B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B")
day <- c(1:50,1:50)
symptom <- c(2,3,3,3,3,2,2,2,2,2,2,3,2,2,2,2,NA,NA,NA,2,2,2,3,3,3,4,4,3,3,2,3,2,2,3,3,2,2,2,2,2,2,3,2,2,2,2,2,3,2,2, 2,2,2,2,2,2,3,2,3,3,2,3,2,3,2,2,2,2,2,2,3,3,3,3,NA,NA,NA,2,2,2,3,2,2,2,2,2,3,2,2,3,NA,NA,NA,3,3,3,3,3,3,2)
df <- data.frame(id,day,symptom)
id day symptom start end exacerbation censor
1 A 1 2 0 0 0 0
2 A 2 3 1 0 1 0
3 A 3 3 0 0 1 0
4 A 4 3 0 0 1 0
5 A 5 3 0 1 1 0
6 A 6 2 0 0 0 0
7 A 7 2 0 0 0 0
8 A 8 2 0 0 0 0
9 A 9 2 0 0 0 0
10 A 10 2 0 0 0 0
11 A 11 2 0 0 0 0
12 A 12 3 0 0 0 0
13 A 13 2 0 0 0 0
14 A 14 2 0 0 0 0
15 A 15 2 0 0 0 0
16 A 16 2 0 0 0 0
17 A 17 NA 0 0 0 0
18 A 18 NA 0 0 0 0
19 A 19 NA 0 0 0 0
20 A 20 2 0 0 0 0
21 A 21 2 0 0 0 0
22 A 22 2 0 0 0 0
23 A 23 3 1 0 1 0
24 A 24 3 0 0 1 0
25 A 25 3 0 0 1 0
26 A 26 4 0 0 1 0
27 A 27 4 0 0 1 0
28 A 28 3 0 0 1 0
29 A 29 3 0 0 1 0
30 A 30 2 0 0 1 0
31 A 31 3 0 0 1 0
32 A 32 2 0 0 1 0
33 A 33 2 0 0 1 0
34 A 34 3 0 0 1 0
35 A 35 3 0 0 1 0
36 A 36 2 0 0 1 0
37 A 37 2 0 0 1 0
38 A 38 2 0 0 1 0
39 A 39 2 0 0 1 0
40 A 40 2 0 0 1 0
41 A 41 2 0 1 1 0
42 A 42 3 0 0 0 0
43 A 43 2 0 0 0 0
44 A 44 2 0 0 0 0
45 A 45 2 0 0 0 0
46 A 46 2 0 0 0 0
47 A 47 2 0 0 0 0
48 A 48 3 0 0 0 0
49 A 49 2 0 0 0 0
50 A 50 2 0 0 0 0
51 B 1 2 0 0 0 0
52 B 2 2 0 0 0 0
53 B 3 2 0 0 0 0
54 B 4 2 0 0 0 0
55 B 5 2 0 0 0 0
56 B 6 2 0 0 0 0
57 B 7 3 0 0 0 0
58 B 8 2 0 0 0 0
59 B 9 3 0 0 0 0
60 B 10 3 1 0 1 0
61 B 11 2 0 0 1 0
62 B 12 3 0 0 1 0
63 B 13 2 0 0 1 0
64 B 14 3 0 0 1 0
65 B 15 2 0 0 1 0
66 B 16 2 0 0 1 0
67 B 17 2 0 0 1 0
68 B 18 2 0 0 1 0
69 B 19 2 0 1 1 0
70 B 20 2 0 0 0 0
71 B 21 3 1 0 1 0
72 B 22 3 0 0 1 0
73 B 23 3 0 0 1 0
74 B 24 3 0 0 1 0
75 B 25 NA 0 0 0 1
76 B 26 NA 0 0 0 1
77 B 27 NA 0 0 0 1
78 B 28 2 0 0 0 1
79 B 29 2 0 0 0 1
80 B 30 2 0 0 0 1
81 B 31 3 0 0 0 1
82 B 32 2 0 0 0 1
83 B 33 2 0 0 0 1
84 B 34 2 0 0 0 1
85 B 35 2 0 0 0 1
86 B 36 2 0 0 0 1
87 B 37 3 0 0 0 0
88 B 38 2 0 0 0 0
89 B 39 2 0 0 0 0
90 B 40 3 0 0 0 0
91 B 41 NA 0 0 0 0
92 B 42 NA 0 0 0 0
93 B 43 NA 0 0 0 0
94 B 44 3 1 0 1 0
95 B 45 3 0 0 1 0
96 B 46 3 0 0 1 0
97 B 47 3 0 0 1 0
98 B 48 3 0 0 1 0
99 B 49 3 0 0 1 0
100 B 50 2 0 0 1 0
>
最佳答案
这是一种尝试以更优雅和可扩展的方式编写您的算法:
首先,在使用 case_when
之前,您不必计算 lead
和 lag
调用。值得注意的是,我发现明确编写 case_when
的 TRUE
选项是一种很好的做法。这是一些代码。
df2=df %>%
mutate(
exacerbation_start = case_when(
is.na(symptom) ~ NA_real_,
symptom <= 2 ~ 0,
symptom >= 3 & symptom >= lag(symptom, n=2) & symptom <= lag(symptom, n=1) ~ 1,
TRUE ~ 0
),
exacerbation_end = case_when(
symptom >=3 ~ ifelse(lead(symptom, n=1) <=2 &
lead(symptom, n=2) <=2 & lead(symptom, n=3) <=2 &
lead(symptom, n=4) <=2 & lead(symptom, n=5) <=2,
1,0),
TRUE ~ NA_real_
)
)
all.equal(df1,df2) #TRUE
或者,如果您的算法对所有症状都相同,您可能需要使用自定义函数:
get_exacerbation_start = function(x){
case_when(
is.na(x) ~ NA_real_,
x <= 2 ~ 0,
x >= 3 & x >= lag(x, n=2) & x <= lag(x, n=1) ~ 1,
TRUE ~ 0
)
}
get_exacerbation_end = function(x){
case_when(
x >=3 ~ ifelse(x >=3 & lead(x, n=1) <=2 &
lead(x, n=2) <=2 & lead(x, n=3) <=2 &
lead(x, n=4) <=2 & lead(x, n=5) <=2,
1,0),
TRUE ~ NA_real_
)
}
df3=df %>%
mutate(
exacerbation_start = get_exacerbation_start(symptom),
exacerbation_end = get_exacerbation_end(symptom)
)
all.equal(df1,df3) #also TRUE
对于某些 mutate_at
调用,后一种方法可能会更加强大。
编辑:在看到您的编辑后,这里是获取恶化期的尝试。在我看来,代码非常丑陋,我不确定 row_number
是否应该以这种方式使用。
df_final=df %>%
transmute(
id,day,symptom,
start = get_exacerbation_start(symptom),
end = get_exacerbation_end(symptom),
exacerbation = row_number()>=which(start==1)[1] & row_number()<=which(end==1)[1]
)
关于r - 如何使用 lag/lead 和 ifelse/case_when(或其他解决方案)处理 R 中的纵向症状数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60168370/
library(dplyr) library(stats) 我正在使用滞后变量运行大量回归,并且我的 R 控制台与上述包有冲突。我知道我可以通过为每次回归输入“dplyr::lag()”来规避这个问题
正如标题所说。加载 pglm 后,lag 停止正常工作。 library(pglm) c(1,2,3,4) %>% lag() 该对象被转换为时间序列,并且不再与 tibbles 兼容。 即使卸载pg
正如标题所说。加载 pglm 后,lag 停止正常工作。 library(pglm) c(1,2,3,4) %>% lag() 该对象被转换为时间序列,并且不再与 tibbles 兼容。 即使卸载pg
我目前正在为我的投资组合网站构建一个修改后的光标。不幸的是,当我尝试滚动和移动光标时,我的光标出现滞后。但是,当我从 HTML、CSS 和 JavaScript 中删除所有其他元素并且只有与我的光标相
如果浏览器应用程序执行计算量较大或阻塞的操作,则事件循环将会延长。 有没有办法获得有关事件循环长度的定性指标? 这是为了衡量客户端 Web 应用程序在客户端上呈现的“容易程度”(即是否有足够的计算资源
我有一个问题。我正在 tkinter 中制作平台游戏,但遇到问题:我现在有:玩家、积木和硬币。我正在更新玩家的 Action 及其动画和硬币的动画,由于某种原因,当我投入太多硬币时,玩家的 Actio
我有一个包含 3 个 fragment 的 ViewPager Fragment。每个都有一个图像作为背景和一个 TextView。 TextView 始终绝对位于屏幕左侧(而不是 Fragment
当我尝试在 CLOB 列上使用 LAG 函数时遇到问题。 假设我们有一张 table create table test ( id number primary key, not_cl
您好,我是 SQL 的新手,希望有人能帮助我解决这个问题。我一直在这里和那里使用滞后函数,但想知道是否有办法重写它以使其进入总和范围。因此,我想将前 12 个月的每个时间段加在一起,而不是之前的一个月
我清楚地记得 T-SQL 永远不会让您混合使用 LAG 和 WHERE。例如, SELECT FOO WHERE LAG(BAR) OVER (ORDER BY DATE) > 7 永远不会工作。无论
我的数据文件是许多结构相似的文本文件的合并: 行“新文件开始”, 行与文件名, “数据线”有两列:域和事件数 每个文件的此类“数据行”数量可能从 0 到数十万不等目标是添加新列,每一行将指示它相关的文
我正在尝试在 R 中复制以下公式: Xt = Xt-1 * b + Zt * (1-b) 我正在使用以下代码 t %>% mutate(x= ifelse(week == 1, z, NaN))
我今天来找你是因为我正在努力处理涉及 LAG 函数的查询(仅供引用,我使用的是 PostgreSQL)。我有一张表格,其中包含每月按国家/地区销售给另一个产品的产品数量。该表定义如下: create
当我尝试在 tibble 中的一列字符上使用滞后函数(来自 dplyr 库)时,我在 R 中遇到以下错误: Error in mutate_impl(.data, dots) : Expecting
我有两个向量,subject 和 target。我想根据两个现有向量之间的比较创建一个新向量,比较元素 lagged。我已经使用下面的循环解决了这个问题,但我本质上想知道是否有使用 apply 的更优
我有一个日期表,我需要在其中存储前一行的 val当前行中的列。但是,我不能使用 LAG子句,因为存在缺失的日期,并且只有在前一个直接日期存在时才应提取前一个值并将其存储在当前行中。因此我必须(我认为)
我是 SQL Server 的新手,我对 lag() 函数有一些疑问。 我必须计算两个用户事件之间的平均距离(以天为单位)。然后,我必须对所有用户进行 GROUP BY,计算每个用户行之间的所有日期差
嗨,我正在我的网络应用程序中实现实时搜索(=输入时搜索)功能。目前我正在使用 keyup 事件通过 ajax post 发送搜索请求,例如 $('#SearchField').keyup(functi
这里可能存在 BigQuery 错误?我正在运行一个查询,该查询使用 LAG() 函数来获取先前的时间采样值。例子: 架构: id: STRING time: TIMESTAMP 询问: SELECT
如何告诉 LAG 函数获取最后一个“非空”值? 例如,请参阅下面的表,其中 B 列和 C 列上有一些 NULL 值。我想用最后一个非空值填充空值。我尝试使用 LAG 函数来做到这一点,如下所示: ca
我是一名优秀的程序员,十分优秀!