маркировка строк в одном наборе данных на основе даты измерения по сравнению с двумя другими датами в другом наборе данных - PullRequest
0 голосов
/ 04 сентября 2018
library(data.table)
testset <- data.table(date=as.Date(c("2013-07-02","2013-08-03","2013-09-04",
                                     "2013-10-05","2013-11-06")), 
                      yr = c(2013,2013,2013,2013,2013), 
                      mo = c(07,08,09,10,11),
                      da = c(02,03,04,05,06), 
                      plant = LETTERS[1:5], 
                      product = as.factor(letters[26:22]), 
                      rating = runif(25))

У меня есть этот набор данных, который для каждой строки я хочу создать категорию или наименование в этой строке в зависимости от столбца даты. Я хочу сравнить эту дату с датами в другом наборе данных:

library(lubridate)
splitDates <- ymd(c("2013-06-10", "2013-08-15", "2013-10-06"))

Использование splitDates Я хочу оценить, какое значение в splitDates было последним до того, как было выполнено измерение. (Если вы предполагаете, что новый эксперимент проводился с 2013-06-10 и до 2013-08-15, но я хочу решить, к какому эксперименту относится измерение).

Как я вижу, первые пять строк в этом новом столбце должны выглядеть следующим образом:

NewColumn <- c("2013-06-10", "2013-06-10", "2013-08-15", "2013-08-15", "2013-10-06")

         date   yr mo da plant product     rating  NewColumn
1: 2013-07-02 2013  7  2     A       z 0.02522850 2013-06-10
2: 2013-08-03 2013  8  3     B       y 0.28274066 2013-06-10
3: 2013-09-04 2013  9  4     C       x 0.86314441 2013-08-15
4: 2013-10-05 2013 10  5     D       w 0.01670862 2013-08-15
5: 2013-11-06 2013 11  6     E       v 0.16034175 2013-10-06
...

Я не могу понять, как это сделать.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Для меня понять твой вопрос было сложнее, чем решить его. Пожалуйста, просмотрите ответ и дайте мне отзыв. Имеет 3 шага:

  1. сделать функцию для возврата самой последней даты из другого набора данных

    findLatest<-function(date){which.min( abs(  splitDates-date  ))} 
    
  2. Затем вызвать функцию для всех дат в testset:

    names<-splitDates[ sapply(testset[,1], findLatest  ) ]  
    
  3. Добавить результат в набор данных

    testset$names<-names
    

Итак, первые 10 строк:

         date   yr mo da plant product     rating         V8
1  2013-07-02 2013  7  2     A       z 0.75801493 2013-06-10
2  2013-08-03 2013  8  3     B       y 0.06370597 2013-08-15
3  2013-09-04 2013  9  4     C       x 0.25375231 2013-08-15
4  2013-10-05 2013 10  5     D       w 0.42900236 2013-10-06
5  2013-11-06 2013 11  6     E       v 0.97613291 2013-10-06
6  2013-07-02 2013  7  2     A       z 0.78094927 2013-06-10
7  2013-08-03 2013  8  3     B       y 0.91312684 2013-08-15
8  2013-09-04 2013  9  4     C       x 0.29345599 2013-08-15
9  2013-10-05 2013 10  5     D       w 0.80870134 2013-10-06
10 2013-11-06 2013 11  6     E       v 0.18735280 2013-10-06
0 голосов
/ 05 сентября 2018

Я должен передать ответ Фрэнку, который прокомментировал мой первый пост.

testset[, v := splitDates[findInterval(date, splitDates)]] 

делает свое дело.

0 голосов
/ 04 сентября 2018

Вот мой дубль

library(dplyr)
dta <- data.frame(NewColumn=splitDates,newvar=1:3)
testset$newvar <- sapply(testset[,1], function(x) ifelse(x<splitDates[2],1,ifelse(x<splitDates[3],2,3)))
final_data <- semi_join(testset,dta,by="newvar")

Данные:

testset <- data.table(date=as.Date(c("2013-07-02","2013-08-03","2013-09-04",
                                 "2013-10-05","2013-11-06")), 
                  yr = c(2013,2013,2013,2013,2013), 
                  mo = c(07,08,09,10,11),
                  da = c(02,03,04,05,06), 
                  plant = LETTERS[1:5], 
                  product = as.factor(letters[26:22]), 
                  rating = runif(25))

splitDates <- ymd(c("2013-06-10", "2013-08-15", "2013-10-06"))
...