使用多个键和值将宽数据帧转置或收集到长数据帧
Transpose or gather wide to long dataframe with multiple keys and values
我正在尝试将宽数据集转换为长而整洁的数据集。我在这类任务中经常使用 tidyr::gather()
函数,只是现在我有了一个非常奇怪的数据集。
以下是我的小版本。正如您可以想象的那样,在它们后面带有 __1
的列会重复,直到数字 __16
或我的真实 datframe 中的某些内容。这可以用 tidyr
或 dplyr
工具修复吗?
# A tibble: 1 x 10
code city party_short party_long votes seats party_short__1 party_long__1 votes__1 seats__1
<dbl> <chr> <chr> <chr> <dbl> <dbl> <chr> <chr> <dbl> <dbl>
1 3630 Amsterdam PVDA Partij van de Arbeid 1833 5.00 HARLBEL Harlinger Belang 942 2.00
为了可重复性:
library(tidyverse)
df <- tibble(code = 3630,
city = "Amsterdam",
party_short = "PVDA",
party_long = "Partij van de Arbeid",
votes = 1833,
seats = 5,
party_short__1 = "HARLBEL",
party_long__1 = "Harlinger Belang",
votes__1 = 942,
seats__1 = 2)
具有所需的输出:
# A tibble: 2 x 6
code city party_short party_long votes seats
<dbl> <chr> <chr> <chr> <dbl> <dbl>
1 3630 Amsterdam PVDA Partij van de Arbeid 1833 5.00
2 3630 Amsterdam HARLBEL Harlinger Belang 942 2.00
我们可以将所有的列汇集起来,以“__”分隔列,然后展开数据框。
library(tidyverse)
df2 <- df %>%
gather(Column, Value, -code, -city) %>%
separate(Column, into = c("Column", "Number"), sep = "__") %>%
spread(Column, Value) %>%
select(-Number)
df2
# # A tibble: 2 x 6
# code city party_long party_short seats votes
# <dbl> <chr> <chr> <chr> <chr> <chr>
# 1 3630. Amsterdam Harlinger Belang HARLBEL 2 942
# 2 3630. Amsterdam Partij van de Arbeid PVDA 5 1833
我在下面使用 data.table
和 tidyr
的组合
library(data.table)
library(tidyr)
setDT(df)
melt(df, id.vars = c('code', 'city')) %>% separate(variable, c('vv', 'bb'), '__') %>%
dcast(code + city + bb ~ vv, value.var = 'value') %>% mutate(bb = NULL)
code city party_long party_short seats votes
1 3630 Amsterdam Harlinger Belang HARLBEL 2 942
2 3630 Amsterdam Partij van de Arbeid PVDA 5 1833
我正在尝试将宽数据集转换为长而整洁的数据集。我在这类任务中经常使用 tidyr::gather()
函数,只是现在我有了一个非常奇怪的数据集。
以下是我的小版本。正如您可以想象的那样,在它们后面带有 __1
的列会重复,直到数字 __16
或我的真实 datframe 中的某些内容。这可以用 tidyr
或 dplyr
工具修复吗?
# A tibble: 1 x 10
code city party_short party_long votes seats party_short__1 party_long__1 votes__1 seats__1
<dbl> <chr> <chr> <chr> <dbl> <dbl> <chr> <chr> <dbl> <dbl>
1 3630 Amsterdam PVDA Partij van de Arbeid 1833 5.00 HARLBEL Harlinger Belang 942 2.00
为了可重复性:
library(tidyverse)
df <- tibble(code = 3630,
city = "Amsterdam",
party_short = "PVDA",
party_long = "Partij van de Arbeid",
votes = 1833,
seats = 5,
party_short__1 = "HARLBEL",
party_long__1 = "Harlinger Belang",
votes__1 = 942,
seats__1 = 2)
具有所需的输出:
# A tibble: 2 x 6
code city party_short party_long votes seats
<dbl> <chr> <chr> <chr> <dbl> <dbl>
1 3630 Amsterdam PVDA Partij van de Arbeid 1833 5.00
2 3630 Amsterdam HARLBEL Harlinger Belang 942 2.00
我们可以将所有的列汇集起来,以“__”分隔列,然后展开数据框。
library(tidyverse)
df2 <- df %>%
gather(Column, Value, -code, -city) %>%
separate(Column, into = c("Column", "Number"), sep = "__") %>%
spread(Column, Value) %>%
select(-Number)
df2
# # A tibble: 2 x 6
# code city party_long party_short seats votes
# <dbl> <chr> <chr> <chr> <chr> <chr>
# 1 3630. Amsterdam Harlinger Belang HARLBEL 2 942
# 2 3630. Amsterdam Partij van de Arbeid PVDA 5 1833
我在下面使用 data.table
和 tidyr
的组合
library(data.table)
library(tidyr)
setDT(df)
melt(df, id.vars = c('code', 'city')) %>% separate(variable, c('vv', 'bb'), '__') %>%
dcast(code + city + bb ~ vv, value.var = 'value') %>% mutate(bb = NULL)
code city party_long party_short seats votes
1 3630 Amsterdam Harlinger Belang HARLBEL 2 942
2 3630 Amsterdam Partij van de Arbeid PVDA 5 1833