2017-04-03 1 views
1

데이터 프레임에서 추가 날짜로 R의 최소 날짜와 최대 날짜 사이의 샘플 날짜를 반환하는 방법은 무엇입니까? 첫째, 기본적으로데이터 프레임에서 R 날짜의 최소 날짜와 최대 날짜 사이의 샘플 날짜를 반환하십시오.

mydata$sampledate <- sample(seq(as.Date(mydata$MinEnrollmentDate), as.Date(mydata$MinEnrollmentDate), by="day"), 1) 

, 어떤이가하는 것은 시작과 사이의 모든 일의 순서를 생성합니다

Course MinEnrollmentDate MaxEnrollmentDate 
Maths 3/11/2016 3/4/2016 
Chemistry 6/11/2016 6/4/2016 
Physics 9/11/2016 9/4/2016 
English 12/11/2016 12/4/2016 
Science 3/11/2017 3/4/2017 
+0

'MinEnrollmentDate'및 'MaxEnrollmentDate'의 열 이름이 서로 바뀌 었다고 생각합니다. 가장 이상적으로,'MaxEnrollmentDate'는> ='MinEnrollmentDate'입니다. – Aramis7d

답변

0

는 데이터 프레임의 이름을 MyData 최선을 다하고 가정하면, 다음 코드를 사용할 수 있습니다 그런 다음 해당 시퀀스에서 크기 1의 샘플을 무작위로 추출하여 데이터 프레임에 씁니다.

1

우리가 할 수있는 dplyr 사용 : 바로 날짜의 형식을 가지고

library(dplyr) 

df <- df %>% 
    rowwise() %>% 
    mutate(MinEnrollmentDate = as.Date(MinEnrollmentDate, format = '%m/%d/%Y'), 
      MaxEnrollmentDate = as.Date(MaxEnrollmentDate, format = '%m/%d/%Y'), 
      sampleDate = sample(seq(MinEnrollmentDate, MaxEnrollmentDate, '-1 day'), 1)) 

df 
#> Source: local data frame [5 x 4] 
#> Groups: <by row> 
#> 
#> # A tibble: 5 x 4 
#>  Course MinEnrollmentDate MaxEnrollmentDate sampleDate 
#>  <chr>   <date>   <date>  <date> 
#> 1  Maths  2016-03-11  2016-03-04 2016-03-08 
#> 2 Chemistry  2016-06-11  2016-06-04 2016-06-09 
#> 3 Physics  2016-09-11  2016-09-04 2016-09-06 
#> 4 English  2016-12-11  2016-12-04 2016-12-09 
#> 5 Science  2017-03-11  2017-03-04 2017-03-06 

확실하지 경우, 그것은 모호한의 format= 부분을 수정 주시기 바랍니다. 데이터 : 1과 기능을 가진 MaxEnrollmentDate 일의 수 사이 MinEnrollmentDate에 임의의 번호를 추가 한 후

days <- as.Date(data$MinEnrollmentDate, format="%d/%m/%Y") - as.Date(data$MaxEnrollmentDate, format="%d/%m/%Y") 

: 그리고 당신은 두 날짜 사이의 일 수를 계산할 수

df <- read.table(text = 'Course MinEnrollmentDate MaxEnrollmentDate 
        Maths 3/11/2016 3/4/2016 
        Chemistry 6/11/2016 6/4/2016 
        Physics 9/11/2016 9/4/2016 
        English 12/11/2016 12/4/2016 
        Science 3/11/2017 3/4/2017', header = T, stringsAsFactors = F) 
1

sample() :

for(i in seq_along(days)) { 
    data[i,4] <- as.character(as.Date(data$MinEnrollmentDate, format="%d/%m/%Y")[i] + sample(1:days[i],1)) 
} 
0

단계 lubridate 솔루션에 의해 단계, 완전성을 위해 (사용 GGamba 년대 df) :

if (!require(lubridate)) { 
    install.packages("lubridate") 
} 

df <- read.table(text = 'Course MinEnrollmentDate MaxEnrollmentDate 
        Maths 3/11/2016 3/4/2016 
        Chemistry 6/11/2016 6/4/2016 
        Physics 9/11/2016 9/4/2016 
        English 12/11/2016 12/4/2016 
        Science 3/11/2017 3/4/2017', header = T, stringsAsFactors = F) 

no_days <- as.POSIXct(df$MinEnrollmentDate, format = "%d/%m/%Y") - as.POSIXct(df$MaxEnrollmentDate, format = "%d/%m/%Y") 

random_days <- sapply(no_days, function(x) sample(x = 1:x, size = 1, replace = T)) 

df$random_date <- as.POSIXct(df$MinEnrollmentDate, format = "%d/%m/%Y") + days(random_days) 
관련 문제