[英]Reshape and combine data from long to wide format with R
我有看起來像這樣的數據:
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
您能指導如何解決這個問題嗎?
這是一個嘗試。 它具有列名,盡管以后可以根據需要將其丟棄。
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
最好使用沒有特殊字符的列名。 如果我們刪除它
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.0
和dplyr_0.5.0
上也能正常工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.