如何从数据框中取消嵌套向量?
How can I unnest a vector from a dataframe?
我有一个长格式的数据框,其中包含公司及其按地区的估计。我想建立一个广泛的 table,在这里我可以看到按地区对一家公司给出了多少正面和负面估计。当我尝试 pivot_wider
时,我收到一个数据框,其单元格中包含向量。没关系,但是我无法按地区计算正面和负面反馈的数量。还尝试使用 unnest
和 unnest_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_cols
和 value
的组合不能唯一标识观察结果时,结果将是一个命名列表。例如,您可能会注意到 Asia
和 n == 5
的组合不止一种,因此我决定使用所有剩余的列,而不是 names_from
和 values_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
我有一个长格式的数据框,其中包含公司及其按地区的估计。我想建立一个广泛的 table,在这里我可以看到按地区对一家公司给出了多少正面和负面估计。当我尝试 pivot_wider
时,我收到一个数据框,其单元格中包含向量。没关系,但是我无法按地区计算正面和负面反馈的数量。还尝试使用 unnest
和 unnest_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_cols
和 value
的组合不能唯一标识观察结果时,结果将是一个命名列表。例如,您可能会注意到 Asia
和 n == 5
的组合不止一种,因此我决定使用所有剩余的列,而不是 names_from
和 values_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
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