【问题标题】:Using "by-argument" in "outer" data.table to filter "inner" data.table使用“外部”数据表中的“按参数”过滤“内部”数据表
【发布时间】:2015-03-26 15:20:22
【问题描述】:

我在理解 data.table 表示法时仍有一些问题。谁能解释为什么以下不起作用?

我正在尝试使用 cut 将日期分类。使用的中断可以在另一个 data.table 中找到,并且取决于外部“data”data.table 的 by 参数

data <- data.table(A = c(1, 1, 1, 2, 2, 2),
                   DATE = as.POSIXct(c("01-01-2012", "30-05-2015", "01-01-2020", "30-06-2012", "30-06-2013", "01-01-1999"), format = "%d-%m-%Y"))

breaks <- data.table(B = c(1, 1, 2, 2),
                     BREAKPOINT = as.POSIXct(c("01-01-2015", "01-01-2016", "30-06-2012", "30-06-2013"), format = "%d-%m-%Y"))

data[, bucket := cut(DATE, breaks[B == A, BREAKPOINT], ordered_result = T), by = A]

我可以得到想要的结果

# expected
data[A == 1, bucket := cut(DATE, breaks[B == 1, BREAKPOINT], ordered_result = T)]
data[A == 2, bucket := cut(DATE, breaks[B == 2, BREAKPOINT], ordered_result = T)]
data 
#    A       DATE     bucket
# 1: 1 2012-01-01         NA
# 2: 1 2015-05-30 2015-01-01
# 3: 1 2020-01-01         NA
# 4: 2 2012-06-30 2012-06-30
# 5: 2 2013-06-30         NA
# 6: 2 1999-01-01         NA

谢谢, 迈克尔

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    问题是cut 产生因子,而这些因子在data.table by 操作中没有得到正确处理(这是一个错误,应该报告 - 因子水平应该以相同的方式处理在rbind.data.tablerbindlist)。对原始表达式的一个简单修复是转换为字符:

    data[, bucket := as.character(cut(DATE, breaks[B == A, BREAKPOINT], ordered_result = T))
         , by = A]
    #   A       DATE     bucket
    #1: 1 2012-01-01         NA
    #2: 1 2015-05-30 2015-01-01
    #3: 1 2020-01-01         NA
    #4: 2 2012-06-30 2012-06-30
    #5: 2 2013-06-30         NA
    #6: 2 1999-01-01         NA
    

    【讨论】:

    • 我觉得和#967有关。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2013-05-19
    • 1970-01-01
    • 2023-04-04
    • 2020-02-20
    • 2021-07-02
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多