Превратите строки в столбцы, затем сложите в один столбец с помощью 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

и т.д...

Я пробовал использовать функции стека, плавления и изменения формы, но безрезультатно. Я также попытался перечислить свои данные, а затем сгладить их, что было полной катастрофой. Любая помощь высоко ценится!


person JeffB    schedule 27.03.2020    source источник
comment
Ваши обновленные данные имеют тот же формат, что и ранее. Я думаю, что требуется только изменение pivot_longer(cols = -STATE, names_to = 'Year', values_to = 'Data'), потому что имя столбца изменено с «Год» на «СОСТОЯНИЕ».   -  person akrun    schedule 28.03.2020


Ответы (1)


Мы можем использовать 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))
person akrun    schedule 27.03.2020
comment
У меня проблемы с командой pivot_longer: это знак ошибки, который я получаю: Ошибка в pivot_long (., Cols = STATE, values_to = Data): не удалось найти функцию pivot_long Я обновил свой пакет tidyverse, а также tidyr и dplyr пакеты. Какие-либо предложения? - person JeffB; 27.03.2020
comment
@JeffB может быть, у вас старая версия пакета tidyr. Моя версия - 1.0.0, так как было добавлено pivot_longer ›= 1.0.0 - person akrun; 27.03.2020
comment
@JeffB ii обновлен опцией, которая должна работать для более старой версии - person akrun; 27.03.2020
comment
Я не совсем понял. Я обновил свой пример, чтобы, возможно, было понятнее. Мне не удалось обновить R Studio до последней версии Tidyr. Я думаю, что у меня проблемы с вводом данных на этапе сбора .... У меня 50 столбцов, включая первый столбец STATE, и я ввожу данные как: DF [, c (2:50). Это моя проблема? - person JeffB; 27.03.2020
comment
@JeffB Я показал преобразование на основе показанного примера. - person akrun; 28.03.2020
comment
Это привело меня туда, куда я хотел попасть! Большое спасибо! - person JeffB; 28.03.2020