r - 基于多列进行拆分,然后在 R 中应用 spread()

标签 r dplyr tidyr purrr

我试图根据 3 列将数据分成 3 部分,然后希望分散数据以进行进一步处理。但是,当我使用 2 列拆分时,代码可以正常工作。它不适用于 3 列。这是建立在 How can I spread repeated measures of multiple variables into wide format? 的讨论之上的。

这是我的数据:

structure(list(Zone = c("East", "East", "East", "East", "East", 
"East", "East", "West", "West", "West", "West", "West", "West", 
"West"), Fiscal.Year = c(2016, 2016, 2016, 2016, 2016, 2016, 
2017, 2016, 2016, 2016, 2017, 2017, 2018, 2018), Transaction.ID = c(132, 
133, 134, 135, 136, 137, 171, 171, 172, 173, 175, 176, 177, 178
), L.Rev = c(3, 0, 0, 1, 0, 0, 2, 1, 1, 2, 2, 1, 2, 1), L.Qty = c(3, 
0, 0, 1, 0, 0, 1, 1, 1, 2, 2, 1, 2, 1), A.Rev = c(0, 0, 0, 1, 
1, 1, 0, 0, 0, 0, 0, 1, 0, 0), A.Qty = c(0, 0, 0, 2, 2, 3, 0, 
0, 0, 0, 0, 3, 0, 0), I.Rev = c(4, 4, 4, 0, 1, 0, 3, 0, 0, 0, 
1, 0, 1, 1), I.Qty = c(2, 2, 2, 0, 1, 0, 3, 0, 0, 0, 1, 0, 1, 
1)), .Names = c("Zone", "Fiscal.Year", "Transaction.ID", "L.Rev", 
"L.Qty", "A.Rev", "A.Qty", "I.Rev", "I.Qty"), row.names = c(NA, 
14L), class = "data.frame")

这是有效的代码:

Input_File %>%
gather(Rev_Qty,Value, L.Rev:I.Qty)  %>%
separate(Rev_Qty, into=c("L.A","Rev.Qty")) %>% 
split(.,list(.$Zone,.$Rev.Qty)) %>%  
#Ideally, I want three-way split--i.e. Fiscal.Year, Zone and Rev.Qty
purrr::map(~unite(.,LAType.Rev.Qty, L.A, Rev.Qty, sep = ".")) %>% 
purrr::map(~spread_(.,key_col = "LAType.Rev.Qty", value_col = "Value"))

这很好用——即我得到了一个长度为 4 的列表,可用于进一步处理。

但是,当我基于 Rev.Qty 应用三向拆分时,以下代码不起作用; 区域Fiscal.Year

Input_File %>%
gather(Rev_Qty,Value, L.Rev:I.Qty)  %>%
separate(Rev_Qty, into=c("L.A","Rev.Qty")) %>% 
#Now split the data based on zone, Rev vs. Qty and year--DOESN'T WORK
split(.,list(.$Zone,.$Rev.Qty,.$Fiscal.Year)) %>%
purrr::map(~unite(.,LAType.Rev.Qty, L.A, Rev.Qty, sep = ".")) %>% 
purrr::map(~spread_(.,key_col = "LAType.Rev.Qty", value_col = "Value"))

我收到以下错误:

Error in enc2utf8(col_names(col_labels, sep = sep)) : 
  argumemt is not a character vector

经过调试,我发现代码执行得很好,直到unite()。一旦我调用spread_(),它就会中断。

预期输出:如果我们运行代码直到 unite(),我们将看到我们将得到一个长度为 12 的列表。预期输出将是此列表之后在 LAType.Rev.QtyValue 列上应用传播。我希望这能澄清预期的输出。

有人可以帮我看看发生了什么事吗?我是初学者,我不知道发生了什么。

最佳答案

我们需要在splitdrop=TRUE来删除数据集中不存在的组合

Input_File %>%
      gather(Rev_Qty,Value, L.Rev:I.Qty)  %>%
      separate(Rev_Qty, into=c("L.A","Rev.Qty")) %>% 
      split(.,list(.$Zone,.$Rev.Qty,.$Fiscal.Year), drop = TRUE) %>%
      purrr::map(~unite(.,LAType.Rev.Qty, L.A, Rev.Qty, sep = ".")) %>% 
      purrr::map(~spread_(.,key_col = "LAType.Rev.Qty", value_col = "Value"))  

关于r - 基于多列进行拆分,然后在 R 中应用 spread(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41519637/

相关文章:

c - 通过 R 在 C 中操作矩阵

c++ - 使用 Rcpp 计算文件序列行数的时间量高于预期

r - 访问 R 中的嵌套列表

R 函数 - 未分配时打印

r - 填写 R 数据框中缺失的行

r - 使用 mutate_all 将所有列除以选定的列

r - 从 r 中的数据框中过滤重复项

R:使用 Gather() 来整理具有两个列标题的数据

r - 如何在复杂数据的情况下分离行

r - 对数据框的所有列进行插值或样条化