Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据条件按ID组合重叠日期_R_Date_Datetime_Dplyr - Fatal编程技术网

R 根据条件按ID组合重叠日期

R 根据条件按ID组合重叠日期,r,date,datetime,dplyr,R,Date,Datetime,Dplyr,我想根据条件为每个ID选择开始和结束日期 对于每个ID,如果结束日期和开始日期之间的差异我建议使用下面的函数,根据ID计算组的结构(列差异,我将其保留在数据框中,但是,它是无关的)。首先,用你的例子 data <- read.table(text= "ID STARTDATE ENDDATE Difference 45 2004-09-04 2004-10-09 NA

我想根据条件为每个ID选择开始和结束日期


对于每个ID,如果结束日期和开始日期之间的差异我建议使用下面的函数,根据ID计算组的结构(列差异,我将其保留在数据框中,但是,它是无关的)。首先,用你的例子

data <- read.table(text=
                  "ID  STARTDATE   ENDDATE     Difference  
                   45  2004-09-04  2004-10-09  NA
                   45  2004-11-04  2004-12-08  26      
                   28  2013-07-25  2013-08-28  NA      
                   28  2013-08-27  2017-04-06  -1
                   81  2013-02-22  2013-03-28  NA
                   81  2013-03-25  2013-04-26  -3
                   81  2013-04-24  2013-05-26  -2
                   81  2013-05-22  2013-06-23  -4
                   81  2013-06-24  2013-07-26  1
                   81  2013-07-22  2013-08-23  -4", header=T)

continuum <- function(data){
  library(parsedate, quietly=T) #access to parse_date() function for automatic recognition of date format
  data[,c("STARTDATE", "ENDDATE")] <- lapply(data[,c("STARTDATE", "ENDDATE")], function(e) as.Date(parse_date(e)))
  data <- data[with(data, order(ID, STARTDATE)),]
  data$diffr <- 0
  result <- data.frame()
  for ( i in unique(data$ID)){
    temp <-data[data$ID==i,]
    if(length(temp$ID)==1){
      startdate <- temp$STARTDATE
      enddate <- temp$ENDDATE
    } else{
    for(j in 1:(length(temp$ID)-1)){
      temp$diffr[j+1] <- difftime(temp$STARTDATE[j+1], temp$ENDDATE[j])
    }
    startdate <- c(temp$STARTDATE[temp$diffr==0], temp$STARTDATE[temp$diffr>14])
      if(identical(rep(TRUE, length(temp$ID)), temp$diffr<=14)){
        enddate <- max(temp$ENDDATE)
      } else{
        enddate <- c(temp$ENDDATE[match(temp$ENDDATE[temp$diffr>14], temp$ENDDATE)-1], temp$ENDDATE[length(temp$diffr)])
      }
      } 
    result <- rbind(result, 
                    data.frame(
                      ID=rep(i, length(startdate)),
                      startdate=startdate,
                      enddate=enddate))
  }
  return(result)
}

continuum(data)
#  ID  startdate    enddate
#1 28 2013-07-25 2017-04-06
#2 45 2004-09-04 2004-10-09
#3 45 2004-11-04 2004-12-08
#4 81 2013-02-22 2013-08-23
您可以重命名列,从上面加载函数并将其应用于数据集
data3

continuum(data3)
哪张照片

 #  ID  startdate    enddate
 #1 28 2013-07-25 2017-06-04
 #2 45 2004-04-09 2004-09-10
 #3 46 2009-02-10 2010-08-08
 #4 75 2011-10-18 2011-11-21
 #5 81 2013-02-22 2013-08-23
EDIT2:我为自己创建了一个复杂的日期示例,并实现了以下功能:

continuum <- function(data){
  data <- data[with(data, order(ID, STARTDATE)),]
  result <- data.frame()
  for ( i in unique(data$ID)){
    temp <-data[data$ID==i,]
    j <- 1
    startdate <- temp$STARTDATE[1]
    enddate <- temp$ENDDATE[1]
    if(length(temp$ID)==1){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))
    } else 
      while(j < length(temp$ID)){
        if(temp$STARTDATE[j+1]-14<=temp$ENDDATE[j]){ 
          startdate <- startdate
          if(temp$ENDDATE[j+1]<=enddate){enddate <- enddate} else{enddate <- temp$ENDDATE[j+1]}
          if(j==(length(temp$ID)-1)){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))}
          j <- j+1
        } else if(temp$STARTDATE[j+1]-14>enddate){
          result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))
          startdate <- temp$STARTDATE[j+1]
          enddate <- temp$ENDDATE[j+1]
          if(j==(length(temp$ID)-1)){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))}
          j <- j+1 
        } else{
          if(temp$ENDDATE[j+1]<=enddate){enddate <- enddate} else{enddate <- temp$ENDDATE[j+1]}
          if(j==(length(temp$ID)-1)){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))}
          j <- j+1}
      }
  }
  return(result)
}
不是很好的日期格式,最好选择像2017-04-23这样的格式


让我知道它是否对您有效。

我建议使用下面的函数按ID计算组的结构(列差异,我将其保留在数据框中,但它与此无关)。首先,用你的例子

data <- read.table(text=
                  "ID  STARTDATE   ENDDATE     Difference  
                   45  2004-09-04  2004-10-09  NA
                   45  2004-11-04  2004-12-08  26      
                   28  2013-07-25  2013-08-28  NA      
                   28  2013-08-27  2017-04-06  -1
                   81  2013-02-22  2013-03-28  NA
                   81  2013-03-25  2013-04-26  -3
                   81  2013-04-24  2013-05-26  -2
                   81  2013-05-22  2013-06-23  -4
                   81  2013-06-24  2013-07-26  1
                   81  2013-07-22  2013-08-23  -4", header=T)

continuum <- function(data){
  library(parsedate, quietly=T) #access to parse_date() function for automatic recognition of date format
  data[,c("STARTDATE", "ENDDATE")] <- lapply(data[,c("STARTDATE", "ENDDATE")], function(e) as.Date(parse_date(e)))
  data <- data[with(data, order(ID, STARTDATE)),]
  data$diffr <- 0
  result <- data.frame()
  for ( i in unique(data$ID)){
    temp <-data[data$ID==i,]
    if(length(temp$ID)==1){
      startdate <- temp$STARTDATE
      enddate <- temp$ENDDATE
    } else{
    for(j in 1:(length(temp$ID)-1)){
      temp$diffr[j+1] <- difftime(temp$STARTDATE[j+1], temp$ENDDATE[j])
    }
    startdate <- c(temp$STARTDATE[temp$diffr==0], temp$STARTDATE[temp$diffr>14])
      if(identical(rep(TRUE, length(temp$ID)), temp$diffr<=14)){
        enddate <- max(temp$ENDDATE)
      } else{
        enddate <- c(temp$ENDDATE[match(temp$ENDDATE[temp$diffr>14], temp$ENDDATE)-1], temp$ENDDATE[length(temp$diffr)])
      }
      } 
    result <- rbind(result, 
                    data.frame(
                      ID=rep(i, length(startdate)),
                      startdate=startdate,
                      enddate=enddate))
  }
  return(result)
}

continuum(data)
#  ID  startdate    enddate
#1 28 2013-07-25 2017-04-06
#2 45 2004-09-04 2004-10-09
#3 45 2004-11-04 2004-12-08
#4 81 2013-02-22 2013-08-23
您可以重命名列,从上面加载函数并将其应用于数据集
data3

continuum(data3)
哪张照片

 #  ID  startdate    enddate
 #1 28 2013-07-25 2017-06-04
 #2 45 2004-04-09 2004-09-10
 #3 46 2009-02-10 2010-08-08
 #4 75 2011-10-18 2011-11-21
 #5 81 2013-02-22 2013-08-23
EDIT2:我为自己创建了一个复杂的日期示例,并实现了以下功能:

continuum <- function(data){
  data <- data[with(data, order(ID, STARTDATE)),]
  result <- data.frame()
  for ( i in unique(data$ID)){
    temp <-data[data$ID==i,]
    j <- 1
    startdate <- temp$STARTDATE[1]
    enddate <- temp$ENDDATE[1]
    if(length(temp$ID)==1){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))
    } else 
      while(j < length(temp$ID)){
        if(temp$STARTDATE[j+1]-14<=temp$ENDDATE[j]){ 
          startdate <- startdate
          if(temp$ENDDATE[j+1]<=enddate){enddate <- enddate} else{enddate <- temp$ENDDATE[j+1]}
          if(j==(length(temp$ID)-1)){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))}
          j <- j+1
        } else if(temp$STARTDATE[j+1]-14>enddate){
          result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))
          startdate <- temp$STARTDATE[j+1]
          enddate <- temp$ENDDATE[j+1]
          if(j==(length(temp$ID)-1)){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))}
          j <- j+1 
        } else{
          if(temp$ENDDATE[j+1]<=enddate){enddate <- enddate} else{enddate <- temp$ENDDATE[j+1]}
          if(j==(length(temp$ID)-1)){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))}
          j <- j+1}
      }
  }
  return(result)
}
不是很好的日期格式,最好选择像2017-04-23这样的格式


让我知道它是否对您有效。

为什么您保留
ID
==45和
Difference
==NA的行,而不保留
Difference
==NA的其他行?因为ID 45的行之间的差异是>=14天。如果差异是>=14天,我不想合并时间段(重叠期)。为什么保留ID为45且差异为NA的行,而不保留ID为45且差异为NA的其他行?因为ID为45的行之间的差异为>=14天。如果差异为>=14天,我不想合并时间段(重叠时间段)。嗨,帕特里克,谢谢你的回复。我有几个简单的问题-因为我已经有了数据帧中的数据,我可以把数据帧的名称替换成“数据”吗?而且,我已经加载了dlpyr,因此我可以省略-“library(dplyr,悄悄地=T)”。在这里-(I in 1:nrow(df)){if(df$overlap[I]=TRUE){df$startdate[I]的结果嗨,帕特里克,谢谢你的回答。我有几个简单的问题-因为我已经有了数据帧中的数据,我可以把数据帧的名称替换成“数据”吗?而且,我已经加载了dlpyr,因此我可以省略-“库(dplyr,quilly=T)”。在这里-(I in 1:nrow(df)){if(df$overlap[I]=TRUE){df$startdate[i]
continuum <- function(data){
  data <- data[with(data, order(ID, STARTDATE)),]
  result <- data.frame()
  for ( i in unique(data$ID)){
    temp <-data[data$ID==i,]
    j <- 1
    startdate <- temp$STARTDATE[1]
    enddate <- temp$ENDDATE[1]
    if(length(temp$ID)==1){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))
    } else 
      while(j < length(temp$ID)){
        if(temp$STARTDATE[j+1]-14<=temp$ENDDATE[j]){ 
          startdate <- startdate
          if(temp$ENDDATE[j+1]<=enddate){enddate <- enddate} else{enddate <- temp$ENDDATE[j+1]}
          if(j==(length(temp$ID)-1)){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))}
          j <- j+1
        } else if(temp$STARTDATE[j+1]-14>enddate){
          result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))
          startdate <- temp$STARTDATE[j+1]
          enddate <- temp$ENDDATE[j+1]
          if(j==(length(temp$ID)-1)){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))}
          j <- j+1 
        } else{
          if(temp$ENDDATE[j+1]<=enddate){enddate <- enddate} else{enddate <- temp$ENDDATE[j+1]}
          if(j==(length(temp$ID)-1)){result <- rbind(result, data.frame(ID=i, STARTDATE=startdate, ENDDATE=enddate))}
          j <- j+1}
      }
  }
  return(result)
}
45 4/11/04 8/12/04 1/01/70 1/01/70 
28 25/07/13 28/08/13 1/01/70 1/01/70