R 如何获取一列合同支出对列表(日期:金额)?

R 如何获取一列合同支出对列表(日期:金额)?,r,time-series,dplyr,R,Time Series,Dplyr,我正在尝试将一列列表对象添加到一个类似于 ID <- c("A", "B", "B", "c", "A", "B", "c", "c", "A", "B") Date = seq(as.Date("2000/07/01"), as.Date("2000/07/10"), "days") Amt <- rnorm(10, 10, 3) E <- data.frame(Date = Date, ID = ID, Amt = Amt) Date ID

我正在尝试将一列列表对象添加到一个类似于

ID <- c("A", "B", "B", "c", "A", "B", "c", "c", "A", "B")
Date = seq(as.Date("2000/07/01"), as.Date("2000/07/10"), "days")
Amt <- rnorm(10, 10, 3)

E <- data.frame(Date = Date, ID = ID, Amt = Amt)

         Date ID       Amt
1  2000-07-01  A  6.663256
2  2000-07-02  B 17.084491
3  2000-07-03  B  8.644242
4  2000-07-04  c  4.729045
5  2000-07-05  A  7.345490
6  2000-07-06  B  4.678909
7  2000-07-07  c  8.907506
8  2000-07-08  c  6.194540
9  2000-07-09  A  7.864848
10 2000-07-10  B 11.269177
ID%
变更(E,流=列表(日期=序号(截止日期(首次付款),截止日期(最后付款)),付款=金额)
错误:无法复制大小为3的向量
E.E%
分组依据(ID)%>%
总结(合同长度=数字形式(不同时间(最后(日期)、第一(日期)、单位=“天”),
首次付款=首次(日期),
上次付款=上次(日期),
飞行路径=列表(d=日期,p=金额),
num_payments=n(),
付款=总额(金额))
错误:应为单个值
我的临时解决方案是:

a = dplyr::filter(E, ID == 'A')
b = dplyr::filter(E, ID == 'B')
c = dplyr::filter(E, ID == 'c')

x.a = list(Date = a$Date,Pay = a$Amt)
x.b = list(Date = b$Date,Pay = b$Amt)
x.c = list(Date = c$Date,Pay = c$Amt)


x.a
$Date
[1] "2000-07-01" "2000-07-05" "2000-07-09"

$Pay
[1] 6.663256 7.345490 7.864848

E.e$stream = list(a,b,c)

E.e
Source: local data frame [3 x 7]

  ID contract_len  first_pay   last_pay num_payments  payment      stream
1  A            8 2000-07-01 2000-07-09            3 21.87359 <S3:data.frame>
2  B            8 2000-07-02 2000-07-10            4 41.67682 <S3:data.frame>
3  c            4 2000-07-04 2000-07-08            3 19.83109 <S3:data.frame>
a=dplyr::filter(E,ID='a')
b=dplyr::filter(E,ID='b')
c=dplyr::filter(E,ID='c')
x、 a=列表(日期=a$日期,付款=a$金额)
x、 b=列表(日期=b$日期,付款=b$金额)
x、 c=列表(日期=c$日期,付款=c$金额)
x、 a
$Date
[1] "2000-07-01" "2000-07-05" "2000-07-09"
美元工资
[1] 6.663256 7.345490 7.864848
E.E$流=列表(a、b、c)
E.E
来源:本地数据帧[3 x 7]
ID合同\u len first\u pay last\u pay num\u付款流
1 A 8 2000-07-01 2000-07-09 3 21.87359
2B2000-07-022000-07-1041.67682
3 c 4 2000-07-04 2000-07-08 3 19.83109

但我显然无法在我的完整数据集中对所有1834个唯一的合同ID执行此操作,我认为我应该能够使用dplyr执行此操作…

我不太清楚您为什么需要此操作,但请看:

library(data.table)
dt = as.data.table(E) # or convert in place using setDT

dt[, .(contract_len = as.numeric(difftime(Date[.N], Date[1], unit = 'days')),
       first_pay = Date[1],
       last_pay = Date[.N],
       num_payments = .N,
       payment = sum(Amt),
       summary = list(data.table(Date, Amt)))
   , by = ID]
#   ID contract_len  first_pay   last_pay num_payments  payment      summary
#1:  A            8 2000-07-01 2000-07-09            3 33.44106 <data.table>
#2:  B            8 2000-07-02 2000-07-10            4 37.83217 <data.table>
#3:  c            4 2000-07-04 2000-07-08            3 26.30531 <data.table>

@Metrics的可能副本未提交到dplyr解决方案,这就是我到目前为止使用的方法。事实上,我的解决方案只使用dplyr进行过滤,然后将3个列表作为列表存储在
E.E$stream
中。一旦数据以这种形式出现,您将如何处理这些数据?当然,这些数据将很难处理,因为它不是真正的矩形data.frame。R中的大多数函数无法与包含可变长度列表的data.frame很好地配合使用。数据真的需要合并到
E.E
<代码>拆分(E[,c(“日期”,“金额”)],E[,“ID”])可以让您以最简单的方式完成。我想获取这些流列表,以及它们在总(花费/时间)中的另一个百分比,这样我就可以构建具有累积百分比的S曲线。(单独的)列表将看起来像
(date1%\u of total:pay1%\u of total;date2%\u of total:pay2%\u of total,等等)
,我将原始(数字)开始日期映射到时间线上的一个点,并从那里以百分比构建累积的S。(想想生存分析吧)@mrflick这也可能是一种有用的格式,同样,这完全取决于你制作后需要做什么。我们离你原来的问题已经很远了。如果你有更具体的事情需要完成,也许你可以在开始新的问题时考虑到具体的任务。不同的任务需要不同的数据配置。没有一种“正确”的方法来存储数据,但有一些方法比其他方法更容易处理。上面的注释字符串中有一个不错的解释字符串。非常感谢这个解决方案。@D8Amonk np;我浏览了一下这些评论,我猜您的原始数据格式已经足够好了,可以做任何您想做的事情。我将发布一个关于我这个项目的一般方法的新问题。我在黑暗中摸索。如果稍后能收到您的意见,我将不胜感激(u 2@mrflick)
a = dplyr::filter(E, ID == 'A')
b = dplyr::filter(E, ID == 'B')
c = dplyr::filter(E, ID == 'c')

x.a = list(Date = a$Date,Pay = a$Amt)
x.b = list(Date = b$Date,Pay = b$Amt)
x.c = list(Date = c$Date,Pay = c$Amt)


x.a
$Date
[1] "2000-07-01" "2000-07-05" "2000-07-09"

$Pay
[1] 6.663256 7.345490 7.864848

E.e$stream = list(a,b,c)

E.e
Source: local data frame [3 x 7]

  ID contract_len  first_pay   last_pay num_payments  payment      stream
1  A            8 2000-07-01 2000-07-09            3 21.87359 <S3:data.frame>
2  B            8 2000-07-02 2000-07-10            4 41.67682 <S3:data.frame>
3  c            4 2000-07-04 2000-07-08            3 19.83109 <S3:data.frame>
library(data.table)
dt = as.data.table(E) # or convert in place using setDT

dt[, .(contract_len = as.numeric(difftime(Date[.N], Date[1], unit = 'days')),
       first_pay = Date[1],
       last_pay = Date[.N],
       num_payments = .N,
       payment = sum(Amt),
       summary = list(data.table(Date, Amt)))
   , by = ID]
#   ID contract_len  first_pay   last_pay num_payments  payment      summary
#1:  A            8 2000-07-01 2000-07-09            3 33.44106 <data.table>
#2:  B            8 2000-07-02 2000-07-10            4 37.83217 <data.table>
#3:  c            4 2000-07-04 2000-07-08            3 26.30531 <data.table>
#[[1]]
#         Date       Amt
#1: 2000-07-01 12.565032
#2: 2000-07-05 14.377863
#3: 2000-07-09  6.498166
#
#[[2]]
#         Date       Amt
#1: 2000-07-02  8.905060
#2: 2000-07-03 10.496663
#3: 2000-07-06  9.989162
#4: 2000-07-10  8.441285
#
#[[3]]
#         Date       Amt
#1: 2000-07-04  6.271645
#2: 2000-07-07  9.937350
#3: 2000-07-08 10.096318