R数据透视表,其中列转换为仅行

时间:2018-08-18 21:40:08

标签: r dplyr pivot-table melt dcast

我基本上是做营销数据的报告,并且正在尝试在R中进行一些自动化。

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

详细信息:在下面的数据集中,我有3列(带有伪数据)的命名,展示位置ID,日期和设备。在这里,我们看到一个展示位置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"))

谢谢。

3 个答案:

答案 0 :(得分:0)

能否请您为数据集创建一个可复制的示例? dput()

如果您尝试过融化,融化几乎总是会增加行数

library(tidyverse)

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

答案 1 :(得分:0)

# 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 :(得分:0)

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

library(rpivotTable)

df %>% 
  rpivotTable()