【问题标题】:Reshape and combine data from long to wide format with R使用 R 重塑和组合从长格式到宽格式的数据
【发布时间】:2017-02-05 03:13:56
【问题描述】:

我有如下数据:-

Customer.Name  Posting.Date  SKU Sales.Amount($)    
A         20150124    SKU1     12345  
B         20150125    SKU2     22345 
A         20150124    SKU3     52345  
A         20150125    SKU4     55345  
C         20150126    SKU6     62345  
B         20150127    SKU7     72345  
C         20150126    SKU8     72945

我正在尝试将其转换为以下不带列名的结构:- 临时数据结构:-

A         20150124    SKU1     SKU 3  
A         20150125    SKU4     
B         20150125    SKU2 
C         20150126    SKU6     SKU8  
B         20150127    SKU7

临时输出按发布日期排序,作为客户级别交易的一部分购买的每个 SKU(由客户名称 + 发布日期标识)都需要转换为列。

最终数据结构(如下)只需要包含在交易中购买的 SKU,其中客户名称和过帐日期列已从上述临时输出中删除。

SKU1     SKU3 
SKU4
SKU2   
SKU6     SKU8 
SKU7

我已尝试使用以下代码获取最终结构,但出现错误。

library(dplyr)
library(tidyr)
Dataset2 <- Data %>% 
group_by(Customer.Name, Posting.Date) %>%
summarise(SKU=toString(unique(SKU))) %>% 
select(Customer.Name, Posting.Date,SKU) %>%
spread(Customer.Name,SKU,drop=FALSE)

我得到的错误是

错误:每个变量都必须命名。问题变量:2

您能指导一下如何解决这个问题吗?

【问题讨论】:

  • 最终需要的数据结构如下:
  • 请从列名中删除($)。对我来说效果很好

标签: r dplyr reshape2 tidyr


【解决方案1】:

这是一次尝试。它有列名,但以后可以根据需要丢弃它们。

df <- data.frame(
  V1=c(     "A",      "B",      "A",      "A",      "C",      "B",      "C" ),
  V2=c(20150124, 20150125, 20150124, 20150125, 20150126, 20150127, 20150126 ),
  V3=c(  "SKU1",   "SKU2",   "SKU3",   "SKU4",   "SKU6",   "SKU7",   "SKU8" ),
  V4=c(   12345,    22345,    52345,    55345,    62345,    72345,    72945 ),
  stringsAsFactors = FALSE
)

我从你的问题推断第四列是不必要的,所以我删除它。

library(dplyr)
library(tidyr)

out1 <- df %>%
  select(-V4) %>%
  group_by(V1, V2) %>%
  mutate(row = row_number()) %>%
  spread(row, V3) %>%
  ungroup()
out1
# # A tibble: 5 × 4
#      V1       V2   `1`   `2`
# * <chr>    <dbl> <chr> <chr>
# 1     A 20150124  SKU1  SKU3
# 2     A 20150125  SKU4  <NA>
# 3     B 20150125  SKU2  <NA>
# 4     B 20150127  SKU7  <NA>
# 5     C 20150126  SKU6  SKU8

out1 %>% select(-V1, -V2)
# # A tibble: 5 × 2
#     `1`   `2`
# * <chr> <chr>
# 1  SKU1  SKU3
# 2  SKU4  <NA>
# 3  SKU2  <NA>
# 4  SKU7  <NA>
# 5  SKU6  SKU8

【讨论】:

  • 您能“接受”这个答案吗? (这是一个很好的礼仪。寻找答案左侧的复选标记。)
【解决方案2】:

最好使用不带特殊字符的列名。如果我们删除它

colnames(Data)[4] <- "Sales.Amount"

OP 的代码运行良好

Dataset2
# A tibble: 4 × 4
#  Posting.Date          A     B          C
#*         <int>      <chr> <chr>      <chr>
#1     20150124 SKU1, SKU3  <NA>       <NA>
#2     20150125       SKU4  SKU2       <NA>
#3     20150126       <NA>  <NA> SKU6, SKU8 
#4     20150127       <NA>  SKU7       <NA>

或者即使使用它,它也可以在 tidyr_0.6.0dplyr_0.5.0 上正常工作

【讨论】:

  • 感谢您的回复。更改变量名后代码对我不起作用。
  • @Sai 我不确定这个案子,因为我对你的例子没有任何问题。 dplyrtidyr 的版本是什么。我发布了我使用的版本
猜你喜欢
  • 2022-07-28
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 2022-01-11
相关资源
最近更新 更多