【问题标题】:Subset data.table by evaluating multiple columns通过评估多列子集 data.table
【发布时间】:2014-09-02 15:59:55
【问题描述】:

如何按最近(最新)类型为每个唯一名称返回 1 行?

6行数据表:

example <- data.table(c("Bob","May","Sue","Bob","Sue","Bob"), 
                      c("A","A","A","A","B","B"),
              as.Date(c("2010/01/01", "2010/01/01", "2010/01/01", 
                   "2012/01/01", "2012/01/11", "2014/01/01")))
setnames(example,c("Name","Type","Date"))
setkey(example,Name,Date)

应该返回 5 行:

# 1:  Bob    A 2012-01-01
# 2:  Bob    B 2014-01-01
# 3:  May    A 2010-01-01
# 4:  Sue    A 2010-01-01
# 5:  Sue    B 2012-01-11

【问题讨论】:

    标签: r max data.table subset


    【解决方案1】:

    由于您已经按照NameDate 进行了排序,您可以在NameType 列上使用unique(调用unique.data.table)函数,以及fromLast = TRUE

    require(data.table) ## >= v1.9.3
    unique(example, by=c("Name", "Type"), fromLast=TRUE)
    #    Name Type       Date
    # 1:  Bob    A 2012-01-01
    # 2:  Bob    B 2014-01-01
    # 3:  May    A 2010-01-01
    # 4:  Sue    A 2010-01-01
    # 5:  Sue    B 2012-01-11
    

    这将为每个 Name,Type 组选择最后一行。希望这会有所帮助。

    PS:正如@mso 指出的那样,这需要1.9.3,因为fromLast 参数仅在1.9.3 中实现(可从github 获得)。

    【讨论】:

    • 第一行答案是:1:Bob A 2010-01-01 而不是:#1:Bob A 2012-01-01。
    • 当时我认为我将不得不编写自己的函数!非常感谢。
    【解决方案2】:

    @Arun 回答工作的以下版本:

    unique(example[rev(order(Name,Date))], by=c("Name", "Type"), fromLast=TRUE)[order(Name,Date)]
       Name Type       Date
    1:  Bob    A 2012-01-01
    2:  Bob    B 2014-01-01
    3:  May    A 2010-01-01
    4:  Sue    A 2010-01-01
    5:  Sue    B 2012-01-11
    
    unique(example[order(Name, Date, decreasing=T)], by=c("Name","Type"))[order(Name, Date)]
       Name Type       Date
    1:  Bob    A 2012-01-01
    2:  Bob    B 2014-01-01
    3:  May    A 2010-01-01
    4:  Sue    A 2010-01-01
    5:  Sue    B 2012-01-11
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 2014-05-23
      相关资源
      最近更新 更多