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 将数据拆分为具有最少NAs数量的时间段_R_Date_Dataframe_Data.table_Subset - Fatal编程技术网

R 将数据拆分为具有最少NAs数量的时间段

R 将数据拆分为具有最少NAs数量的时间段,r,date,dataframe,data.table,subset,R,Date,Dataframe,Data.table,Subset,我需要将我的数据分为3个不同的时间段,但我希望这样做,每个Y的间隔(缺失数据)最少。以下是我的数据: Data <- data.frame( Y = c(rep("A",10),rep("B",10),rep("C",10),rep("D",10),rep("E",10)), X = c(sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),sample(seq(as.Date('2017/0

我需要将我的数据分为3个不同的时间段,但我希望这样做,每个Y的间隔(缺失数据)最少。以下是我的数据:

Data <- data.frame(
  Y = c(rep("A",10),rep("B",10),rep("C",10),rep("D",10),rep("E",10)),
  X = c(sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),c(as.Date('2017/05/02'),sample(seq(as.Date('2017/05/01'), as.Date('2017/09/01'), by="day"), 9)),sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),c(as.Date('2017/05/03'),sample(seq(as.Date('2017/05/01'), as.Date('2017/09/01'), by="day"), 9)))
)

在这种情况下,如果我将第一个期间定义为2017/03/01至2017/05/03,而不是2017/04/30,我将不会在第一个期间为C组和E组提供NA,这是我想要的

所以我希望这三个阶段是:

  • 第1期:2017/03/01至2017/04/30
  • 第二期:2017/05/01至2017/06/30
  • 第三期:2017/07/01至2017/09/30

但是,随着这些周期的开始/结束,它最多可以有10天的灵活性。除了视觉上看,还有什么方法可以做到这一点吗?

因为我们可以移动两个边界,每个边界的间隔为10个单位,所以有21x21=441个选项。这似乎小到可以使用暴力(或者这是一个简化的数据集,您的实际问题是否更大?)

无论如何,这里有一些非常不理想的代码,可以满足您的要求:

Data <- data.frame(
  Y = c(rep("A",10),rep("B",10),rep("C",10),rep("D",10),rep("E",10)),
  X = c(sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),c(as.Date('2017/05/02'),sample(seq(as.Date('2017/05/01'), as.Date('2017/09/01'), by="day"), 9)),sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),c(as.Date('2017/05/03'),sample(seq(as.Date('2017/05/01'), as.Date('2017/09/01'), by="day"), 9)))
)

split1 = as.Date('2017/05/01')
split2 = as.Date('2017/07/01')

library(dplyr)
argmin=[i,j]
minimum = 999

for(i in seq(-10,10))
{
  for(j in seq(-10,10))
  {
    df = Data %>% group_by(Y) %>% summarize(period1 = sum(X<(split1+i)),
                                       period2 = sum(X>=(split1+i) & X<(split2+j)),
                                       period3 = sum(X>=(split2+j)))
    if(sum(df==0)<minimum)
    {
      argmin = c(i,j)
      minimum = sum(df==0)
    }

  }
}

cat(paste0("period 1: 2017-03-01 to ",split1+argmin[1]-1,"\n"))
cat(paste0("period 2: ",split1+argmin[1]," to ",split2+argmin[2]-1,"\n"))
cat(paste0("period 3: ",split2+argmin[2]," to 2017-09-30 \n"))
cat(paste0("Total NA's: ", minimum))

如果您创建包含随机数的样本数据,例如
runif()
rnorm()
sample()
,请使用
set.seed()
使数据可复制。否则,您的分析和预期结果取决于其他用户可能看起来非常不同的数据。谢谢。如果您创建包含随机数的样本数据,例如
runif()
rnorm()
sample()
,请使用
set.seed()
使数据可复制。非常感谢。
Data <- data.frame(
  Y = c(rep("A",10),rep("B",10),rep("C",10),rep("D",10),rep("E",10)),
  X = c(sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),c(as.Date('2017/05/02'),sample(seq(as.Date('2017/05/01'), as.Date('2017/09/01'), by="day"), 9)),sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),c(as.Date('2017/05/03'),sample(seq(as.Date('2017/05/01'), as.Date('2017/09/01'), by="day"), 9)))
)

split1 = as.Date('2017/05/01')
split2 = as.Date('2017/07/01')

library(dplyr)
argmin=[i,j]
minimum = 999

for(i in seq(-10,10))
{
  for(j in seq(-10,10))
  {
    df = Data %>% group_by(Y) %>% summarize(period1 = sum(X<(split1+i)),
                                       period2 = sum(X>=(split1+i) & X<(split2+j)),
                                       period3 = sum(X>=(split2+j)))
    if(sum(df==0)<minimum)
    {
      argmin = c(i,j)
      minimum = sum(df==0)
    }

  }
}

cat(paste0("period 1: 2017-03-01 to ",split1+argmin[1]-1,"\n"))
cat(paste0("period 2: ",split1+argmin[1]," to ",split2+argmin[2]-1,"\n"))
cat(paste0("period 3: ",split2+argmin[2]," to 2017-09-30 \n"))
cat(paste0("Total NA's: ", minimum))
period 1: 2017-03-01 to 2017-05-03
period 2: 2017-05-04 to 2017-06-20
period 3: 2017-06-21 to 2017-09-30 
Total NA's: 0