基于另一列,将 R Data.table 中的列值分组

5

我有一个主数据表,它有364行和3列:

Date        Weekday     Weight
2012-01-01  Monday      100
2013-01-02  Tuesday     200
...

一个带有7行2列的help数据表:

Weekday   Coefficient
Monday    0.91
Tuesday   0.84
Wednesday 0.99
...

现在我想在主数据表中创建第四列,该列基于星期几的“权重/系数”。

Weight_divided <- main[, Weight * help[Weekday==main$Weekday]$Coefficient]

结果如下:
Date        Weekday     Weight   Weight_divided
2012-01-01  Monday      100      91
2013-01-02  Tuesday     200      168
2012-01-03  Wednesday   300      297
2012-01-04  Thursday    400      256
2012-01-05  Friday      500      399
2012-01-06  Saturday    600      410
2012-01-07  Sunday      700      680
2012-01-08  Monday      300      NA     <--
2012-01-09  Tuesday     600      NA     <--
...

我猜问题在于两个数据表的长度不同。有没有办法在主数据表操作中引用较短的数据表使其正常工作?


3
尝试使用setDT(main, key='Weekday')[help][, Weight_divided:=Weight/Coefficient]。这将使代码更有效,并在帮助函数的基础上将重量除以系数。 - akrun
顺便说一句,我还没有测试过这个代码,因为你提供的示例和期望的结果无法再现。 - akrun
1
@akrun 我猜是 重量*系数 - nicola
我错过了它是一个 data.table。是的,在查看结果表时,你应该执行乘法而不是除法。 - Andriy T.
@nicola:是的,你是对的,应该用“*”而不是“/”,对此抱歉。 - RandomDude
1个回答

2

使用 data.table

library(data.table)
setkey(main, Weekday)[help, Weight_Coef := Weight*Coefficient][order(Date)]
  #      Weekday       Date Weight Weight_Coef
  # 1:    Monday 2012-01-01     59       53.69
  # 2:   Tuesday 2012-01-02     45       37.80
  # 3: Wednesday 2012-01-03    141      139.59
  # 4:  Thursday 2012-01-04    104       97.76
  # 5:    Friday 2012-01-05    133      109.06
  #---                                        
  #360: Wednesday 2012-12-25    192      190.08
  #361:  Thursday 2012-12-26     79       74.26
  #362:    Friday 2012-12-27     39       31.98
  #363:  Saturday 2012-12-28    175      148.75
  #364:    Sunday 2012-12-29    134      116.58

数据

set.seed(24)
main <- data.table(Weekday=rep(c('Monday', 'Tuesday', 'Wednesday',
'Thursday', 'Friday', 'Saturday', 'Sunday'), length.out=364),
Date=seq(as.Date('2012-01-01'), length.out=364, by='day'), 
Weight=sample(200, 364, replace=TRUE))

help <- data.table(Weekday=c('Monday', 'Tuesday', 'Wednesday',
'Thursday', 'Friday', 'Saturday', 'Sunday'), Coefficient=c(0.91, 0.84, 
 0.99, 0.94, 0.82, 0.85, 0.87))

1
setkey(main, Weekday)[help, Weight_Coef := Weight*Coefficient] 工作得非常好!感谢您的帮助。 - RandomDude
@RandomDude 很高兴知道它起作用了。感谢您的反馈。 - akrun
2
概念理解:如果你在两个独立的data.table中都需要某些列,你首先应该考虑如何合并它们。合并是(从某种意义上说)将你的分开的数据表的“列空间”组合在一起的方法。 - MichaelChirico
@MichaelChirico 没错,感谢您的评论。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接