如何从数据框中取消嵌套向量?

How can I unnest a vector from a dataframe?

我有一个长格式的数据框,其中包含公司及其按地区的估计。我想建立一个广泛的 table,在这里我可以看到按地区对一家公司给出了多少正面和负面估计。当我尝试 pivot_wider 时,我收到一个数据框,其单元格中包含向量。没关系,但是我无法按地区计算正面和负面反馈的数量。还尝试使用 unnestunnest_longer 函数。后者虽然似乎解决了我的问题,但只需要一个参数即可取消嵌套列。

我怎样才能修改我的 pivot_wider 以获得理想的结果?

我的数据框:

set.seed(1407)
test_df <- data.frame(code = rep(c("positive", "negative"), 9),
                      company = c("Google", "Amazon", "SpaceX", "BlueOrigin",
                                  "Google", "Western Digital", "Aliexpress",
                                  "Tencent", "Aliexpress"),
                      n = rbinom(18, size = 9, prob = 0.5),
                      region = c("Asia", "Europe", "Middle East")) 

我使用一个函数来扩大 table:

test_df %>% 
  pivot_wider(id_cols = region,
              names_from = code,
              values_from = n)

# A tibble: 3 x 3
  region      positive  negative 
  <chr>       <list>    <list>   
1 Asia        <int [3]> <int [3]>
2 Europe      <int [3]> <int [3]>
3 Middle East <int [3]> <int [3]>

我想要的输出:

region      positive  negative

Asia            4        2
Asia            3        5
Asia            5        2
Europe          3        5
Europe          6        4
Europe          5        1
Middle East     8        5
Middle East     6        5
Middle East     6        2

您可以按照以下方式修改您的解决方案。当 id_colsvalue 的组合不能唯一标识观察结果时,结果将是一个命名列表。例如,您可能会注意到 Asian == 5 的组合不止一种,因此我决定使用所有剩余的列,而不是 names_fromvalues_from 中指定的列 id_cols 作为默认选择,而不仅仅是 region

library(tidyr)

test_df %>% 
  pivot_wider(names_from = code,
              values_from = n) %>%
  arrange(region)

# A tibble: 9 x 4
  company         region      positive negative
  <chr>           <chr>          <int>    <int>
1 Google          Asia               4        5
2 BlueOrigin      Asia               5        2
3 Aliexpress      Asia               3        2
4 Amazon          Europe             6        5
5 Google          Europe             3        1
6 Tencent         Europe             5        4
7 SpaceX          Middle East        8        5
8 Western Digital Middle East        6        5
9 Aliexpress      Middle East        6        2

使用 reshape

的基础 R 选项
reshape(
    test_df,
    direction = "wide",
    idvar = c("company", "region"),
    timevar = "code"
)

给予

          company      region n.positive n.negative
1          Google        Asia          5          6
2          Amazon      Europe          4          6
3          SpaceX Middle East          2          2
4      BlueOrigin        Asia          5          6
5          Google      Europe          5          3
6 Western Digital Middle East          2          4
7      Aliexpress        Asia          6          3
8         Tencent      Europe          5          3
9      Aliexpress Middle East          4          4