我在数据框中有两列,商店编号(113个值)和存储"属于"有六个值(1-6):
pct_v2 [C(" StoreNumber"" groups_pct&#34)]
StoreNumber groups_pct
1 1
2 2
4 3
5 4
6 2
9 5
10 5
12 4
20 1
23 4
我想创建一个表,其中group_pct值是列,单元格条目是StoreNumber列的值:
Group_pct
2 3 4 5 6
----------------------------------------------
1 2 4 5 9
20 6 12 10
23
这可以在tidyverse中完成吗?
答案 0 :(得分:0)
pct <- structure(list(StoreNumber = c(1L, 2L, 4L, 5L, 6L, 9L, 10L, 12L, 20L, 23L), groups_pct = c(1L, 2L, 3L, 4L, 2L, 5L, 5L, 4L, 1L, 4L), i = 1:10), .Names = c("StoreNumber", "groups_pct", "i"), row.names = c(NA, -10L), class = "data.frame")
它不漂亮,但你可以使用:
library(tidyr)
pct$i <- 1:10 # required for spread, then discarded with [-1]
pct2 <- lapply(spread(pct, groups_pct, StoreNumber)[-1], na.omit)
str(pct2)
# List of 5
# $ 1: atomic [1:2] 1 20
# ..- attr(*, "na.action")=Class 'omit' int [1:8] 2 3 4 5 6 7 8 10
# $ 2: atomic [1:2] 2 6
# ..- attr(*, "na.action")=Class 'omit' int [1:8] 1 3 4 6 7 8 9 10
# $ 3: atomic [1:1] 4
# ..- attr(*, "na.action")=Class 'omit' int [1:9] 1 2 4 5 6 7 8 9 10
# $ 4: atomic [1:3] 5 12 23
# ..- attr(*, "na.action")=Class 'omit' int [1:7] 1 2 3 5 6 7 9
# $ 5: atomic [1:2] 9 10
# ..- attr(*, "na.action")=Class 'omit' int [1:8] 1 2 3 4 5 8 9 10
pct3 <- lapply(pct2, function(l) c(l, rep(NA, max(lengths(pct2))-length(l))))
str(pct3)
# List of 5
# $ 1: int [1:3] 1 20 NA
# $ 2: int [1:3] 2 6 NA
# $ 3: int [1:3] 4 NA NA
# $ 4: int [1:3] 5 12 23
# $ 5: int [1:3] 9 10 NA
as.data.frame(pct3)
# X1 X2 X3 X4 X5
# 1 1 2 4 5 9
# 2 20 6 NA 12 10
# 3 NA NA NA 23 NA
所以...用tidyverse很难得到你想要的东西。我猜有很多方法可以将它合并到其中的一些步骤中,但是你真的想要一些数据来达到这一点。