programing tip

dcast와 유사한 깔끔한 여러 열에 스프레드를 사용할 수 있습니까?

itbloger 2020. 12. 2. 08:11
반응형

dcast와 유사한 깔끔한 여러 열에 스프레드를 사용할 수 있습니까?


다음과 같은 더미 데이터가 있습니다.

library(dplyr)
library(tidyr)
library(reshape2)
dt <- expand.grid(Year = 1990:2014, Product=LETTERS[1:8], Country = paste0(LETTERS, "I")) %>%   select(Product, Country, Year)
dt$value <- rnorm(nrow(dt))

두 가지 제품-국가 조합을 선택합니다.

sdt <- dt %>% filter((Product == "A" & Country == "AI") | (Product == "B" & Country =="EI"))

각 조합에 대한 값을 나란히보고 싶습니다. 나는 이것을 할 수 있습니다 dcast:

sdt %>% dcast(Year ~ Product + Country)

spread패키지 tidyr 에서 이것을 할 수 있습니까?


하나의 옵션은 '제품'과로 '나라'열을 결합하여 새로운 'Prod_Count'을 만들 것 paste의로 그 열을 제거 select'폭'사용하기 '긴'에서와 모양 변경 spread에서 tidyr.

 library(dplyr)
 library(tidyr)
 sdt %>%
 mutate(Prod_Count=paste(Product, Country, sep="_")) %>%
 select(-Product, -Country)%>% 
 spread(Prod_Count, value)%>%
 head(2)
 #  Year      A_AI       B_EI
 #1 1990 0.7878674  0.2486044
 #2 1991 0.2343285 -1.1694878

또는 unitefrom tidyr(@beetroot의 의견에서) 을 사용하여 몇 단계를 피하고 이전과 같이 모양을 변경할 수 있습니다 .

 sdt%>% 
 unite(Prod_Count, Product,Country) %>%
 spread(Prod_Count, value)%>% 
 head(2)
 #   Year      A_AI       B_EI
 # 1 1990 0.7878674  0.2486044
 # 2 1991 0.2343285 -1.1694878

pivot_wider()tidyr 버전 1.0.0에 도입 된 새로운 함수를 사용하면 한 번의 함수 호출로이 작업을 수행 할 수 있습니다.

pivot_wider()(상대 :) pivot_longer()spread(). 그러나 여러 키 / 이름 열 (및 / 또는 여러 값 열) 사용과 같은 추가 기능을 제공합니다. 이를 names_from위해 새 변수의 이름을 가져 오는 열을 나타내는 인수 는 둘 이상의 열 이름 (여기 ProductCountry)을 사용할 수 있습니다.

library("tidyr")

sdt %>% 
    pivot_wider(id_cols = Year,
                names_from = c(Product, Country)) %>% 
    head(2)
#> # A tibble: 2 x 3
#>     Year   A_AI    B_EI
#>    <int>  <dbl>   <dbl>
#>  1  1990 -2.08  -0.113 
#>  2  1991 -1.02  -0.0546

참조 : https://tidyr.tidyverse.org/articles/pivot.html

참고 URL : https://stackoverflow.com/questions/24929954/is-it-possible-to-use-spread-on-multiple-columns-in-tidyr-similar-to-dcast

반응형