R 长到宽-重复列

R 长到宽-重复列,r,dplyr,tidyr,R,Dplyr,Tidyr,我在这个网站和谷歌上搜索了Tidyr和Dplyr标签大约两天,最后出于沮丧决定发布 我有以下数据框: Name Date Sheets Location Weekday_vs_weekend Cost Jake Aug 28 2 House Weekday .18 Jake Aug 28 1 House Weekday .09 Kob

我在这个网站和谷歌上搜索了Tidyr和Dplyr标签大约两天,最后出于沮丧决定发布

我有以下数据框:

Name      Date   Sheets    Location    Weekday_vs_weekend    Cost
Jake    Aug 28    2          House            Weekday        .18
Jake    Aug 28    1          House            Weekday        .09
Kobe    Aug 28    3          Park             Weekend        .27
Kobe    Aug 28    2          Park             Weekend        .18
Jake    Aug 29    1          Library          Weekend        .09
Jordan  Aug 29    8          Library          Weekend        .72
Jordan  Aug 29    4          Library          Weekday        .36
我希望将日期变量转换为列(我可以使用spread()实现这一点,通过aggregate()提供总成本和工作表的总和),使用“每个日期的工作表”列的总和作为将日期变量转换为“列”后要使用的值,然后对“日期”列中的每个日期重复剩余变量

Name    Aug 28   Cost  Location    WkDay_WkEnd    Aug 29  Cost   Location    WkDay_WkEnd
Jake      3      27      House       Weekday         1    .09    Library       Weekday 
Kobe      5      45      Park        Weekday        NA     NA       NA           NA
Jordan    NA     NA       NA           NA           12    1.08   Library       Weekend 

这里有一种使用
data.table
包的可能方法。尽管我不知道如何使用如此广泛的格式

这里的想法是对数值列求和,然后在非数值列上运行
unique
,然后在两者之间进行简单的联接

在此类数据集上使用
tidyr
的主要问题是
spread
没有
fun.aggregate
属性

library(data.table) # V 1.9.6+
indx <- sapply(df[names(df)[-(1:2)]], is.numeric)

DT1 <- dcast(setDT(df), 
       Name ~ Date, 
       value.var = names(df)[-(1:2)][indx],
       sum,
       fill = NA)

DT2 <- dcast(df, 
       Name ~ Date, 
       value.var = names(df)[-(1:2)][!indx],
       unique,
       fill = NA)

DT1[DT2, on = "Name"]
#      Name Sheets_sum_Aug 28 Sheets_sum_Aug 29 Cost_sum_Aug 28 Cost_sum_Aug 29 Location_unique_Aug 28 Location_unique_Aug 29
# 1:   Jake                 3                 1            0.27            0.09                  House                Library
# 2: Jordan                NA                12              NA            1.08                     NA                Library
# 3:   Kobe                 5                NA            0.45              NA                   Park                     NA
#    Weekday_vs_weekend_unique_Aug 28 Weekday_vs_weekend_unique_Aug 29
# 1:                          Weekday                          Weekend
# 2:                               NA                          Weekday
# 3:                          Weekend                               NA
library(data.table)#V 1.9.6+

indx你能清楚地告诉我们你想做什么吗?恐怕我不能回答你的问题。还有一个问题。我能问你为什么在乔丹和科比身上有NAs?我看不出背后的逻辑。我对乔丹有NA,因为乔丹在8月28日没有印刷任何东西,而我对科比有NA,因为他在8月29日没有印刷,你的真实想法是什么数据有更多的日期?如果是这样的话,这会很快变得混乱。顺便说一句,制作一个易于复制的可复制的示例比只向我们显示数据的打印输出要好。我直到现在才意识到
上的
选项。谢谢。@jazzurro是的,这是v1.9.6+中的一个新功能(这就是为什么在
库中添加该选项的原因)