【问题标题】:Long to wide - Repeating columns从长到宽 - 重复列
【发布时间】:2015-10-14 22:57:23
【问题描述】:

我已经在这个网站和 Google 上搜索了大约两天的 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() 提供总成本和工作表的总和,使用工作表列 PER 日期的总和作为将日期变量转换为列后使用的值,然后为日期列中的每个日期重复剩余变量。

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 

【问题讨论】:

  • 您能清楚地告诉我们您想要做什么吗?恐怕我无法在这个问题上跟随你。多一个。我能问一下为什么你有乔丹和科比的 NA 吗?我看不出它背后的逻辑。
  • 我有乔丹的 NA,因为乔丹在 8 月 28 日没有打印任何东西,我有科比的 NA,因为他没有在 8 月 29 日打印任何东西
  • 你的真实数据有更多的日期吗?如果是这样,这将很快变得混乱。顺便说一句,最好制作一个易于复制粘贴的示例,而不是只向我们展示您的数据的打印输出。

标签: r dplyr tidyr


【解决方案1】:

这是使用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

【讨论】:

  • 直到现在我才意识到on 选项。谢谢你。
  • @jazzurro 是的,这是 v 1.9.6+ 中的一个新功能(这就是为什么在library 上添加了该功能)
猜你喜欢
  • 2021-04-30
  • 2021-06-21
  • 2016-12-28
  • 1970-01-01
  • 2019-11-22
  • 2021-08-26
  • 2016-09-23
  • 2012-12-01
  • 1970-01-01
相关资源
最近更新 更多