Соберите данные в r с несколькими столбцами - PullRequest
1 голос
/ 04 октября 2019

У меня есть некоторые данные, которые я пытаюсь использовать tidy R и функцию pivot long в R, чтобы получить результат, как указано ниже. Но я не могу этого сделать, я получаю данные

У меня есть данные в этом формате. (со многими другими именами столбцов)

Country State   Year 1  Population 1    Year 2  Population2
U.S.A   IL  2009    20000   2010    30000
U.S.A   VA  2009    30000   2010    40000

Я хочу получить данные в этом формате.

Country State   Year    Population
U.S.A   IL  2009    20000
U.S.A   IL  2010    30000
U.S.A   VA  2009    30000
U.S.A   VA  2010    40000

Я могу сделать это только для столбца, но не могу передатьдругим столбцам нравится, например, население

Мой код указан ниже.

file1<-file %>%
 pivot_longer(
   cols = contains("Year"),
   names_sep = "_",
  names_to = c(".value", "repeat"),

 )

Мне удалось заставить его работать на Tidyverse.

library(tidyverse)
file<-read_excel("peps300.xlsx")

names(file)<-str_replace_all(names(file), c("Year " = "Year_" , "Num " = "Num_", "DRate " = "DRate_" , "PRate " = "PRate_",  "Denom " = "Denom_"))

file<-file %>%
 pivot_longer(
   cols = c(contains("Year"),contains("Num"),contains("DRate"),contains("PRate"),contains("Denom")),
   names_sep = "_",
  names_to = c(".value", "repeat")
 )

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Можно указать cols, что starts_with "Население" или "Год"

library(dplyr)
df1 %>% 
    pivot_longer(cols = c(starts_with("Population"), starts_with("Year")), 
    names_to = c(".value", "group"), names_pattern = "(.*)_(.*)")
# A tibble: 4 x 5
#  Country State group Population  Year
#  <chr>   <chr> <chr>      <int> <int>
#1 U.S.A   IL    1          20000  2009
#2 U.S.A   IL    2          30000  2010
#3 U.S.A   VA    1          30000  2009
#4 U.S.A   VA    2          40000  2010

данные

df1 <- structure(list(Country = c("U.S.A", "U.S.A"), State = c("IL", 
"VA"), Year_1 = c(2009L, 2009L), Population_1 = c(20000L, 30000L
), Year_2 = c(2010L, 2010L), Population_2 = c(30000L, 40000L)), 
   class = "data.frame", row.names = c(NA, 
-2L))
1 голос
/ 04 октября 2019
df %>%
    pivot_longer(
        -c(Country,State),
        names_to = c(".value","group"),
        names_pattern = "(.+)_(.+)"
    )
# A tibble: 4 x 5
  Country State group Year  Population
  <chr>   <chr> <chr> <chr> <chr>     
1 U.S.A   IL    1     2009  20000     
2 U.S.A   IL    2     2010  30000     
3 U.S.A   VA    1     2009  30000     
4 U.S.A   VA    2     2010  40000 

Затем вы можете сбросить group, если вам это не нужно.

И для этого вам сначала нужно будет очистить имена столбцов. Убедитесь, что все они следуют одинаковому шаблону, а слова связаны с одним пробелом или одним подчеркиванием.

df <- structure(list(Country = c("U.S.A", "U.S.A"), State = c("IL", 
"VA"), Year_1 = c("2009", "2009"), Population_1 = c("20000", 
"30000"), Year_2 = c("2010", "2010"), Population_2 = c("30000", 
"40000")), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -2L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...