【问题标题】:r - Conditionally subtract two data tablesr - 有条件地减去两个数据表
【发布时间】:2018-01-16 10:22:02
【问题描述】:

我有两个 data.tables 显示多个位置的温度(由地理编码识别)。

我想根据它们的减法创建第三个。他们在这里:

library(data.table)

# Generate random data:
geocode <- paste0("N", 1:10)
dates <- seq(as.Date("2000-01-01"), as.Date("2004-12-31"), by="month")
models <- c("A", "B", "C", "D", "E")
temp <- runif(length(geocode)*length(dates)*length(models), min=0, max=30)
dt1 <- data.table(expand.grid(Location=geocode,Date=dates,Model=models),Temperature=temp)


ref <- runif(length(geocode), min=0, max=30)
dt2 <- data.table(expand.grid(Location=geocode), Temperature=ref)

我想有条件地从 dt1 中减去 dt2。通过每个位置(地理编码),我想从 dt1 中的温度中减去 dt2 中的温度,保留其他列(DateModel)。

如何做到这一点?如果它是单个数据表,我会知道该怎么做,但我以前从未尝试过像这样在两个不同的数据表上做代数。

【问题讨论】:

    标签: r data.table conditional-statements subtraction


    【解决方案1】:

    我认为这可行:

    dt1[dt2, on=.(Location), td := x.Temperature - i.Temperature, by=.EACHI]
    
          Location       Date Model Temperature          td
       1:       N1 2000-01-01     A    3.949276 -19.2110455
       2:       N2 2000-01-01     A    2.811684 -11.6405195
       3:       N3 2000-01-01     A   24.069659  13.6159779
       4:       N4 2000-01-01     A   25.809426  -1.8793405
       5:       N5 2000-01-01     A   25.193624  19.6812965
      ---                                                  
    2996:       N6 2004-12-01     E   24.298463   4.0218859
    2997:       N7 2004-12-01     E    1.488011 -26.4472283
    2998:       N8 2004-12-01     E   27.489108   5.6525076
    2999:       N9 2004-12-01     E    3.487664  -5.9926003
    3000:      N10 2004-12-01     E    8.523718  -0.7559126
    

    目测...

    dt2[dt1[1:5], on=.(Location), .(Location, t1 = i.Temperature, t2 = x.Temperature)]
    
       Location        t1        t2
    1:       N1  3.949276 23.160321
    2:       N2  2.811684 14.452204
    3:       N3 24.069659 10.453681
    4:       N4 25.809426 27.688766
    5:       N5 25.193624  5.512328
    

    我觉得很合适。


    它是如何工作的

    更新连接的语法是x[i, v := expr, by=.EACHI]。在表达式内部,前缀i.*x.* 可用于阐明从何处获取列。

    by=.EACHI 可能不需要,但我通常使用它。

    【讨论】:

    • 感谢您的建议,它可以满足我的需求!也感谢您的解释。
    【解决方案2】:

    merge (left_join),然后是mutate

    library(dplyr)
    dt3 <- left_join(dt1, dt2, by="Location") %>%
              mutate(desired=Temperature.x-Temperature.y)
    

    输出

      Location       Date Model Temperature.x Temperature.y     desired
    1       N1 2000-01-01     A      4.158847     17.531085 -13.3722373
    2       N2 2000-01-01     A      9.644764     23.184142 -13.5393783
    3       N3 2000-01-01     A      4.644948     20.946587 -16.3016384
    4       N4 2000-01-01     A      3.966845     25.232795 -21.2659502
    5       N5 2000-01-01     A      6.639178     29.325365 -22.6861873
    6       N6 2000-01-01     A      6.791424      6.957811  -0.1663875
    

    取消选择 Temperature.x 和 Temperature.y

    dt3 <- dt3 %>% select(-Temperature.x, -Temperature.y)
    

    【讨论】:

    • 感谢您提供第一个答案,顺便说一句效果很好!但是,我需要坚持data.table 解决方案,因为我还有更多操作要对数据集执行,而且我对dplyr 不是很熟悉...
    • 没问题。我也赞成data.table 解决方案。
    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多