【问题标题】:R Pivot table with columns converted to only rowsR数据透视表,列转换为仅行
【发布时间】:2018-08-18 21:40:07
【问题描述】:

我主要负责报告营销数据,并尝试在 R 中进行一些自动化。

在 excel 中,我们可以将列拖动并选择到数据透视表的“行”区域以汇总数据。我有类似的情况,我想对数据集的 3 列中的 2 列进行分组或汇总,其中第 3 列是区分其他两列的关键。

详细说明:在下面的数据集中,我有 3 列(带有虚拟数据)命名、放置 ID、日期和设备。在这里,我们看到一个 Placement ID 在同一天重复了 3 次,但在不同的设备上。

Placement ID      Date  Device
12456362    31-08-2018  Mobile 
12456363    30-08-2018  Desktop
12456364    25-08-2018  Tablet
12456362    31-08-2018  Tablet
12456363    30-08-2018  Desktop
12456364    25-08-2018  Mobile 
12456362    31-08-2018  Desktop
12456363    30-08-2018  Mobile 
12456364    25-08-2018  Tablet
12456362    24-08-2018  Tablet
12456363    12-08-2018  Desktop
12456364    10-08-2018  Mobile 
12456362    19-08-2018  Desktop
12456363    25-08-2018  Mobile 
12456364    25-08-2018  Tablet
12456362    10-08-2018  Mobile 
12456363    19-08-2018  Desktop
12456364    30-08-2018  Tablet

现在我有参考文件,我必须在其中填写每个展示位置 ID 的成本。参考文件只有两列,即日期和展示位置 ID,其中没有重复项,即对于每个展示位置 ID,都有不同的日期和与之相关的相应成本。这是一个例子:

Placement ID      Date  Cost
12456362    10-08-2018  1200
12456362    19-08-2018  1300
12456362    24-08-2018  1400
12456362    31-08-2018  1500
12456363    12-08-2018  1600
12456363    19-08-2018  1700
12456363    25-08-2018  1800
12456363    30-08-2018  1900
12456364    10-08-2018  2000
12456364    25-08-2018  2100
12456364    30-08-2018  2200

现在在 excel 中,我将简单地创建数据透视表,并将日期和位置 ID 拖到“行”字段下以将其全部聚合,这是所需的输出:

Placement ID      Date 
12456362    10-08-2018
12456362    19-08-2018
12456362    24-08-2018
12456362    31-08-2018
12456363    12-08-2018
12456363    19-08-2018
12456363    25-08-2018
12456363    30-08-2018
12456364    10-08-2018
12456364    25-08-2018
12456364    30-08-2018

我想在 R 中实现上述结果。我已经尝试过熔化和转换函数,但是当我熔化数据集时,我没有将 2 列与任何值相关联,这是我做不到的,所以 df_melt 返回更多行数比 df 的原始计数。代码如下:

df_Melt <- melt(_df, id.vars=c("Date","Placement ID"))

提前致谢。

【问题讨论】:

  • 您想要的输出是没有Cost 列的第二个数据集。我想我错过了一些东西。你能多解释一下你想要达到的目标吗?
  • 您好 Antonio,非常感谢您的回复,我想要的输出是只有第三个数据集,即一个展示位置 ID 和它重复的日期。带有成本的数据集只是一个参考文件,它是一个不同的数据集,其中键是放置 ID 和日期,成本将用连接填充。我只是放了第二个以便更好地理解。

标签: r dplyr pivot-table melt dcast


【解决方案1】:
# example data
df = read.table(text = "
PlacementID      Date  Device
12456362    31-08-2018  Mobile 
12456363    30-08-2018  Desktop
12456364    25-08-2018  Tablet
12456362    31-08-2018  Tablet
12456363    30-08-2018  Desktop
12456364    25-08-2018  Mobile 
12456362    31-08-2018  Desktop
12456363    30-08-2018  Mobile 
12456364    25-08-2018  Tablet
12456362    24-08-2018  Tablet
12456363    12-08-2018  Desktop
12456364    10-08-2018  Mobile 
12456362    19-08-2018  Desktop
12456363    25-08-2018  Mobile 
12456364    25-08-2018  Tablet
12456362    10-08-2018  Mobile 
12456363    19-08-2018  Desktop
12456364    30-08-2018  Tablet
", header=T, stringsAsFactors=T)

library(dplyr)
library(lubridate)

df %>%
  distinct(PlacementID, Date) %>% # get distinct combinations of those columns
  arrange(PlacementID, dmy(Date)) # order by those columns

然后返回:

#    PlacementID       Date
# 1     12456362 10-08-2018
# 2     12456362 19-08-2018
# 3     12456362 24-08-2018
# 4     12456362 31-08-2018
# 5     12456363 12-08-2018
# 6     12456363 19-08-2018
# 7     12456363 25-08-2018
# 8     12456363 30-08-2018
# 9     12456364 10-08-2018
# 10    12456364 25-08-2018
# 11    12456364 30-08-2018

请注意,如果您已经有了 Date 列的日期格式,则不需要使用 lubridate 和函数 ymd

【讨论】:

    【解决方案2】:

    您能否为您的数据集创建一个可重现的示例?输入()

    melt 几乎总是会增加行数,你试过了吗

    library(tidyverse)
    
    Pivot <- _df %>% gather_by(Date,Placement_ID) %>% summarise(Mean_Value? = mean(Value))
    

    【讨论】:

      【解决方案3】:

      如果您只是探索数据,请尝试使用 rpivot:

      library(rpivotTable)
      
      df %>% 
        rpivotTable()
      

      【讨论】:

        猜你喜欢
        • 2021-10-25
        • 2012-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-03
        相关资源
        最近更新 更多