通过差分2行向R中的data.table添加新行

通过差分2行向R中的data.table添加新行,r,data.table,R,Data.table,我的数据表如下: Month Portfolio ExcessReturn 196306 Portfolio 1 -0.303536 196306 Portfolio 10 -1.250765 196307 Portfolio 1 3.2952484 196307 Portfolio 10 6.4787957 我想为每个月添加一行,其中“投资组合中的价值”列为“投资组合LS”,而“超额回报中的价值”列为“投资组合10和投资组合1的超额回报

我的数据表如下:

Month    Portfolio     ExcessReturn
196306   Portfolio 1    -0.303536
196306   Portfolio 10    -1.250765
196307   Portfolio 1     3.2952484
196307   Portfolio 10    6.4787957
我想为每个月添加一行,其中“投资组合中的价值”列为“投资组合LS”,而“超额回报中的价值”列为“投资组合10和投资组合1的超额回报之间的差值”


任何帮助都将不胜感激

我们可以按“月”、“投资组合”(作为新值)进行分组,获得“ExcessReturn”的差异以汇总数据集(“out”),然后使用原始数据集和
顺序对“月”进行
rbind

library(data.table)
out <- setDT(df1)[, .(ExcessReturn = diff(ExcessReturn)),
       .(Month)][, Portfolio  := 'Portfolio LS']
rbind(df1, out)[order(Month)]
数据
df1我们可以按“月”、“投资组合”(作为新值)进行分组,获得“ExcessReturn”的
diff
差值以汇总数据集(“out”),然后使用原始数据集和
order
对“月”进行排序

library(data.table)
out <- setDT(df1)[, .(ExcessReturn = diff(ExcessReturn)),
       .(Month)][, Portfolio  := 'Portfolio LS']
rbind(df1, out)[order(Month)]
数据
df1使用
dplyr
,您可以这样做:

library(dplyr)

df %>%
  group_by(Month) %>%
  summarise(ExcessReturn = ExcessReturn[Portfolio == 'Portfolio 10'] - 
                           ExcessReturn[Portfolio == 'Portfolio 1'], 
            Portfolio = 'Portfolio LS') %>%
  bind_rows(df) %>%
  arrange(Month, Portfolio)

#   Month ExcessReturn Portfolio   
#   <int>        <dbl> <chr>       
#1 196306       -0.304 Portfolio 1 
#2 196306       -1.25  Portfolio 10
#3 196306       -0.947 Portfolio LS
#4 196307        3.30  Portfolio 1 
#5 196307        6.48  Portfolio 10
#6 196307        3.18  Portfolio LS
库(dplyr)
df%>%
分组单位(月)%>%
总结(ExceSReturn=ExceSReturn[Portfolio==Portfolio 10']-
ExceSReturn[Portfolio=='Portfolio 1'],
投资组合='投资组合LS')%>%
绑定_行(df)%>%
安排(月、投资组合)
#月超额回报投资组合
#                   
#1 196306-0.304组合1
#2 196306-1.25组合10
#3 196306-0.947公升
#4 196307 3.30投资组合1
#5 196307 6.48投资组合10
#6196307 3.18投资组合LS

使用
dplyr
,您可以执行以下操作:

library(dplyr)

df %>%
  group_by(Month) %>%
  summarise(ExcessReturn = ExcessReturn[Portfolio == 'Portfolio 10'] - 
                           ExcessReturn[Portfolio == 'Portfolio 1'], 
            Portfolio = 'Portfolio LS') %>%
  bind_rows(df) %>%
  arrange(Month, Portfolio)

#   Month ExcessReturn Portfolio   
#   <int>        <dbl> <chr>       
#1 196306       -0.304 Portfolio 1 
#2 196306       -1.25  Portfolio 10
#3 196306       -0.947 Portfolio LS
#4 196307        3.30  Portfolio 1 
#5 196307        6.48  Portfolio 10
#6 196307        3.18  Portfolio LS
库(dplyr)
df%>%
分组单位(月)%>%
总结(ExceSReturn=ExceSReturn[Portfolio==Portfolio 10']-
ExceSReturn[Portfolio=='Portfolio 1'],
投资组合='投资组合LS')%>%
绑定_行(df)%>%
安排(月、投资组合)
#月超额回报投资组合
#                   
#1 196306-0.304组合1
#2 196306-1.25组合10
#3 196306-0.947公升
#4 196307 3.30投资组合1
#5 196307 6.48投资组合10
#6196307 3.18投资组合LS