如何识别 R 中一列的值变化?
How to identify value change in one column in R?
我计划识别并提取经历过从旧药到新药的药物变化的受试者。
在下面的代码中,有两种药物:A和B,A类是老药,B类是新药,B有不同的药牌:2,3和4。
每个人随着时间的流逝,药物变化有3种模式:
11号患者将药物从A型改为B型,只有A型和B型可以,B型改为A型不算改变
患者 12 一直使用 B 型,但他从品牌 2 更改为品牌 3。
患者 13 从 A 型变为 B 型,但他再次从品牌 2 变为品牌 3。
df <- data.frame(id = c(11,11,11,11,12,12,12,12,13,13,13,13),
drug_type = c("A","A","B","B","B","B","B","B","A","A","B","B"),
drug_brand = c(1,1,2,2,2,3,3,3,1,1,2,3),
date = c("2020-01-01","2020-02-01","2020-03-01","2020-03-13",
"2019-04-05","2019-05-02","2019-06-03","2019-08-04",
"2021-02-02","2021-02-27","2021-03-22","2021-04-11"))
df$date <- as.Date(df$date)
那么我应该如何从这个数据集中筛选出换药的患者呢?
为了解决这个问题,我在两个数据框中总结了 A 类药物的最后使用日期和 B 类药物的首次使用日期。我在内部加入了 id 和过滤器,条件是类型 B 的第一个日期晚于类型 A 的最后一个日期,但这可能只能解决从类型 A 到类型 B 的变化。我不知道如何识别所有药物变化的模式。
我还没有找到任何解决方案或类似的问题,所以我真诚地希望你能与我分享你的想法。谢谢你的时间。
您的最终目标是否只是过滤掉任何更改了 drug_brand
或 drug_type
的主题?如果是这样,您可以使用带 dplyr::n_distinct()
的分组过滤器来删除具有 >1 个品牌或 >1 类型的主题:
library(dplyr)
df %>%
group_by(id) %>%
filter(
n_distinct(drug_type) == 1,
n_distinct(drug_brand) == 1
) %>%
ungroup()
也许您可以查看 drug_type
从“A”到“B”的过渡,或者包括不同 drug_brand
的数量大于 1 的地方?
library(tidyverse)
df %>%
group_by(id) %>%
filter(any(drug_type == "B" & lag(drug_type) == "A") |
n_distinct(drug_brand) > 1)
我计划识别并提取经历过从旧药到新药的药物变化的受试者。
在下面的代码中,有两种药物:A和B,A类是老药,B类是新药,B有不同的药牌:2,3和4。
每个人随着时间的流逝,药物变化有3种模式:
11号患者将药物从A型改为B型,只有A型和B型可以,B型改为A型不算改变
患者 12 一直使用 B 型,但他从品牌 2 更改为品牌 3。
患者 13 从 A 型变为 B 型,但他再次从品牌 2 变为品牌 3。
df <- data.frame(id = c(11,11,11,11,12,12,12,12,13,13,13,13), drug_type = c("A","A","B","B","B","B","B","B","A","A","B","B"), drug_brand = c(1,1,2,2,2,3,3,3,1,1,2,3), date = c("2020-01-01","2020-02-01","2020-03-01","2020-03-13", "2019-04-05","2019-05-02","2019-06-03","2019-08-04", "2021-02-02","2021-02-27","2021-03-22","2021-04-11")) df$date <- as.Date(df$date)
那么我应该如何从这个数据集中筛选出换药的患者呢?
为了解决这个问题,我在两个数据框中总结了 A 类药物的最后使用日期和 B 类药物的首次使用日期。我在内部加入了 id 和过滤器,条件是类型 B 的第一个日期晚于类型 A 的最后一个日期,但这可能只能解决从类型 A 到类型 B 的变化。我不知道如何识别所有药物变化的模式。
我还没有找到任何解决方案或类似的问题,所以我真诚地希望你能与我分享你的想法。谢谢你的时间。
您的最终目标是否只是过滤掉任何更改了 drug_brand
或 drug_type
的主题?如果是这样,您可以使用带 dplyr::n_distinct()
的分组过滤器来删除具有 >1 个品牌或 >1 类型的主题:
library(dplyr)
df %>%
group_by(id) %>%
filter(
n_distinct(drug_type) == 1,
n_distinct(drug_brand) == 1
) %>%
ungroup()
也许您可以查看 drug_type
从“A”到“B”的过渡,或者包括不同 drug_brand
的数量大于 1 的地方?
library(tidyverse)
df %>%
group_by(id) %>%
filter(any(drug_type == "B" & lag(drug_type) == "A") |
n_distinct(drug_brand) > 1)