将行转为列,然后使用 R 堆叠成单列
Turn rows to columns, then stack into single column using R
我有一个数据框,我需要将其转换以用于面板研究。我想将我的行转换为列,然后将这些列堆叠成一列。我目前的数据:
STATE 1970 1971 1972 1973...2018
State-A X X X X X
State-B X X X X X
State-C X X X X X
我需要的:
Year State Data
1970 A X
1971 A X
...
2018 A X
1970 B X
1971 B X
等...
我试过堆栈、熔化和重塑函数都无济于事。我还尝试列出我的数据然后将其展平,这完全是一场灾难。非常感谢任何帮助!
我们可以使用tidyverse
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = -Year, values_to = 'Data') %>%
c
# A tibble: 12 x 3
# Year State Data
# <chr> <chr> <chr>
# 1 1970 A X
# 2 1971 A X
# 3 1972 A X
# 4 1973 A X
# 5 1970 B X
# 6 1971 B X
# 7 1972 B X
# 8 1973 B X
# 9 1970 C X
#10 1971 C X
#11 1972 C X
#12 1973 C X
更新
使用更新后的示例,变化是
df1 %>%
pivot_longer(cols = -STATE, names_to = 'Year', values_to = 'Data')
如果tidyr
的包版本是旧的,使用gather
df1 %>%
gather(name, Data, -Year) %>%
separate(Year, into = c('other', 'State')) %>%
select(Year = name, State, Data)
或 melt
library(data.table)
melt(setDT(df1), id.var = 'Year', value.name = 'Data')[,
.(State = sub('.*-', '', Year), Year = variable, Data)]
数据
df1 <- structure(list(Year = c("State-A", "State-B", "State-C"), `1970` = c("X",
"X", "X"), `1971` = c("X", "X", "X"), `1972` = c("X", "X", "X"
), `1973` = c("X", "X", "X")), class = "data.frame", row.names = c(NA,
-3L))
我有一个数据框,我需要将其转换以用于面板研究。我想将我的行转换为列,然后将这些列堆叠成一列。我目前的数据:
STATE 1970 1971 1972 1973...2018
State-A X X X X X
State-B X X X X X
State-C X X X X X
我需要的:
Year State Data
1970 A X
1971 A X
...
2018 A X
1970 B X
1971 B X
等...
我试过堆栈、熔化和重塑函数都无济于事。我还尝试列出我的数据然后将其展平,这完全是一场灾难。非常感谢任何帮助!
我们可以使用tidyverse
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = -Year, values_to = 'Data') %>%
c
# A tibble: 12 x 3
# Year State Data
# <chr> <chr> <chr>
# 1 1970 A X
# 2 1971 A X
# 3 1972 A X
# 4 1973 A X
# 5 1970 B X
# 6 1971 B X
# 7 1972 B X
# 8 1973 B X
# 9 1970 C X
#10 1971 C X
#11 1972 C X
#12 1973 C X
更新
使用更新后的示例,变化是
df1 %>%
pivot_longer(cols = -STATE, names_to = 'Year', values_to = 'Data')
如果tidyr
的包版本是旧的,使用gather
df1 %>%
gather(name, Data, -Year) %>%
separate(Year, into = c('other', 'State')) %>%
select(Year = name, State, Data)
或 melt
library(data.table)
melt(setDT(df1), id.var = 'Year', value.name = 'Data')[,
.(State = sub('.*-', '', Year), Year = variable, Data)]
数据
df1 <- structure(list(Year = c("State-A", "State-B", "State-C"), `1970` = c("X",
"X", "X"), `1971` = c("X", "X", "X"), `1972` = c("X", "X", "X"
), `1973` = c("X", "X", "X")), class = "data.frame", row.names = c(NA,
-3L))