【问题标题】:Create a new variable using dplyr where, based on whether one variable has a specific value AND the previous or next value has a different value in R使用 dplyr 创建一个新变量,其中基于一个变量是否具有特定值并且前一个或下一个值在 R 中具有不同的值
【发布时间】:2026-02-16 04:30:02
【问题描述】:

我有这样的数据

df <- data.frame(
ID = c(rep("A12345",5), rep("A23456",10), rep("A34567",5), "A45678", "A67891", rep("A78910",8), "A91011", 
       rep("A10111",4), rep("A11121",3), "A12131", "A16731"),
medication = c(rep("colchicine",5), rep("febuxosat",9), "hosps", rep("colchicine",5), "hosps", "colchicine", 
              rep("allopurinol",8), "allopurinol", 
              rep("colchicine",3), "hosps", rep("colchicine",3), "colchicine", "allopurinol"),
Date = c("2004-12-08", "2005-01-28", "2005-07-15", "2005-08-23", "2005-11-30", "2007-02-01", "2007-07-20", "2014-06-03", 
         "2008-04-17",
         "2008-12-19", "2009-09-09", "2010-02-24", "2010-11-01", "2010-12-03", "2011-08-10", "2012-11-05", "2012-12-17", 
         "2012-12-19", "2013-10-03", "2013-12-11", "2014-03-26", "2015-11-12", "2014-08-07", "2008-01-31", "2008-02-21", 
         "2008-09-19", "2008-11-06", "2009-01-06", "2009-01-14", "2009-03-25", "2009-03-27", "2009-06-18", "2009-08-18", 
         "2009-09-08", "2009-11-13", "2010-01-21", "2010-04-19", "2010-07-07", "2010-08-06", "2010-08-19")
)

然后我想根据日期创建一个新的年份变量;根据年份和他们的唯一 ID 将每个人分组在一起,并计算一个变量,该变量衡量他们在那一年为该唯一 ID 接受药物的次数。

df <- df %>%
mutate(year = as.numeric(substr(Date, 1,4))) %>%
group_by(ID) %>%
mutate(meds_count = ifelse(medication %in% c("colchicine", "allopurinol", "febuxosat"), 1, 0)) %>%
unite(ID_year, ID, year, sep = "_", remove = FALSE) %>%
group_by(ID_year) %>%
mutate(meds_sum = sum(meds_count)) %>%
distinct(ID_year, .keep_all = TRUE) 

然后我创建一个新变量“gout”,如果 meds_sum 变量等于或大于 4,则该变量值为 1;否则为 0。

df <- df %>%
mutate(gout = ifelse(meds_sum >= 4, 1, 0))

然后,我想创建一个新变量“gout2”,如果 meds_sum 变量等于或大于 4,则该变量为 1,如果 meds_sum 在前一年或后一年非零,则为 1。这是我为最后一步尝试做的事情,但是 lead() 和 lag() 在这段代码中创建了 NA 值。

 df <- df %>% 
 mutate(gout2 = ifelse((meds_sum >= 4 & ((lead(meds_sum) >= 1 | lag(meds_sum)) >= 1)), 1, 0))

谁能告诉我我做错了什么?

这是我希望输出的样子:

df$gout2 <- c(0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0)

【问题讨论】:

  • df$gout2 您定义的所需输出,我认为,需要根据您创建的虚拟 df 进行更正。

标签: r lag dplyr lead


【解决方案1】:

在最后一步使用此代码,您需要使用 group_by() 对变量“ID”进行分组,以产生所需的效果。

df <- df %>% 
  group_by(ID)%>%
  mutate(gout2 = ifelse((meds_sum >= 4 & ((lead(meds_sum) >= 1 | lag(meds_sum)) >= 1)), 1, 0))

希望这有助于(Y)@Laura

【讨论】:

    最近更新 更多