R语言 基于间隔内的值和日期创建评分

nvbavucw  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(130)

我需要帮助编码一个二进制列,指示一个测量值高于阈值,并在第二个测量值的一年间隔内找到。 Dataframe 有4列(ID,结果类型,日期和结果值),可能如下所示:

IDrow type       Date value
1    ID1  NP1 2018-06-11   4.5
2    ID1  NP2 2018-08-21    55
3    ID2  NP1 2016-04-23   4.7
4    ID3  NP1 2015-11-24   9.5
5    ID3  NP2 2015-11-24  7390
6    ID3  NP2 2016-11-24   308
7    ID4  NP1 2015-01-01   6.0
8    ID4  NP2 2018-01-01   100
9    ID5  NP1 2013-04-04   4.0
10   ID5  NP2 2013-04-04    13

如表所示,有两种类型的结果。一些ID没有两种类型,这很好。我需要帮助来编写一个新列,指示NP 2发生在NP 1测量的+-一年内。如果这是真的,并且NP 2的值大于〉25,那么新列应该是1。如果NP 2结果对ID不可用,如果在NP 1日期间隔中未找到NP 2的日期,则该列应声明为0(对于ID 4),并且如果在该间隔中找到了日期,但NP 2的值〈25,则该列也应声明为0(对于ID 5)。
我想要的输出如下所示:

IDrow type       Date value positive
1    ID1  NP1 2018-06-11   4.5        1
2    ID1  NP2 2018-08-21    55        1
3    ID2  NP1 2016-04-23   4.7        0
4    ID3  NP1 2015-11-24   9.5        1
5    ID3  NP2 2015-11-24  7390        1
6    ID3  NP2 2016-11-24   308        1
7    ID4  NP1 2015-01-01   6.0        0
8    ID4  NP2 2018-01-01   100        0
9    ID5  NP1 2013-04-04   4.0        0
10   ID5  NP2 2013-04-04    13        0

我已经尝试过dplyr与mutate和case_when,但我的技能与dplyr不足时,与日期的工作。

IDrow <- c("ID1", "ID1", "ID2", "ID3", "ID3", "ID3", "ID4", "ID4", "ID5", "ID5")
type <- c("NP1", "NP2", "NP1", "NP1", "NP2", "NP2", "NP1", "NP2", "NP1", "NP2")
Date <- c("2018-06-11","2018-08-21",
          "2016-04-23", 
          "2015-11-24", "2015-11-24", "2016-11-24",
          "2015-01-01", "2018-01-01",
          "2013-04-04", "2013-04-04")
value <- c("4.5", "55", 
           "4.7",
           "9.5", "7390", "308",
           "6.0", "100",
           "4.0", "13")
df <- as.data.frame(cbind(IDrow, type, Date, value))
df$Date <- ymd(df$Date)
df <- df %>% group_by(IDrow, Date) %>% 
  mutate(positive = case_when
         ("NP2" %in% type & Date %within% Date+-duration(365, units="days") & "NP1" %in% type ~ 1))

提前感谢-任何帮助都是感激之情。

htrmnn0y

htrmnn0y1#

# Load the packages
library(lubridate)
library(dplyr)

# Load the data
IDrow <- c("ID1", "ID1", "ID2", "ID3", "ID3", "ID3", "ID4", "ID4", "ID5", "ID5")
type <- c("NP1", "NP2", "NP1", "NP1", "NP2", "NP2", "NP1", "NP2", "NP1", "NP2")
Date <- c(
  "2018-06-11", "2018-08-21",
  "2016-04-23",
  "2015-11-24", "2015-11-24", "2016-11-24",
  "2015-01-01", "2018-01-01",
  "2013-04-04", "2013-04-04"
)
value <- c(
  4.5, 55,
  4.7,
  9.5, 7390, 308,
  6.0, 100,
  4.0, 13
)

# Transform the date variable
df <- data.frame(IDrow, type, Date = ymd(Date), value)

# Add a new variable based on your conditions
df %>%
  group_by(IDrow) %>%
  mutate(positive = ifelse(
    length(type) > 1,
    (Date[type == "NP2"] %within% interval(Date[type == "NP1"] - years(1), Date[type == "NP1"] + years(1))) & value[type == "NP2"] > 25,
    0
  ))

相关问题