【问题标题】:labelling rows in one data set based on the date of the measurement compared to two other dates in another dataset根据测量日期与另一个数据集中的其他两个日期相比,标记一个数据集中的行
【发布时间】:2018-09-04 17:03:10
【问题描述】:
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 年 6 月 10 日到但不包括 2013 年 8 月 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
...

我不知道该怎么做。

【问题讨论】:

  • 如果我理解正确,这些值总是来自splitDates
  • testset[, v := splitDates[findInterval(date, splitDates)]] 似乎有效?相关:stackoverflow.com/q/15712826

标签: r date split data.table


【解决方案1】:

这是我的看法

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"))

【讨论】:

    【解决方案2】:

    对我来说,理解你的问题比解决它更难。请查看答案,并给我一个反馈。它有 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
    

    【讨论】:

    • 我得到错误名称
    • 抱歉names&lt;-splitDates[ sapply(testset[,1], findLatest ) ] 的错误是什么?你事先加载了findLatest 吗?
    • 是的,我做到了。它只是在丹麦语中表示警告。
    【解决方案3】:

    我必须将答案交给弗兰克,他对我的第一篇帖子发表了评论。

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

    成功了。

    【讨论】:

    • 我也很欣赏这个解决方案。但是,使用@Frank 评论作为您自己的解决方案并不好。也许你可以把它变成一个社区。​​span>
    • 另外,虽然很短,但我无法完全理解它是如何工作的
    • 我也没有。我没有用作解决方案,但希望弗兰克会来认领它。我创建了一个新条目,以便其他人更容易找到答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2020-12-05
    • 1970-01-01
    • 2020-09-13
    • 2017-01-10
    相关资源
    最近更新 更多