2017-11-25 3 views
0

몇 개의 행을 슬라이스하고 데이터를 다른 변수로 데이터 집합에 다시 추가하려고합니다. 그래서 내 작업이 이렇게 간다 ... 변환행을 잘라내어 변수로 다시 넣기 R

location year value 
aus  1990 1 
aus  1991 2 
aus  1992 2 
usa  1990 1 
usa  1991 3 
usa  1992 2 
uk  1990 3 
uk  1991 2 
uk  1992 2 
...  

into something like this 

year value_aus value_usa value_uk 
1990  1   1   3 
1991  2   3   2 
1992  2   2   2 
. 
. 
. 

내 데이터는 36 개국으로 56 년간있다.

다음과 같이 내가 노력

..

nations<-factor(data$LOCATION) 
nationlist<-nations[!duplicated(nations)] 


data_w<-data.frame(year=data$TIME[data$LOCATION==nationlist[1]]) 

for(loc in c(as.character(nationlist))){ 
    data_w<-data.frame(data_w[,], loc = data$Value[data$LOCATION==loc], check.rows=TRUE) 
    } 

그러나 이것은 "인수는 행 수 서로 다른 의미 : 56, 54 '일을하고 밖으로 뱉어하지 않았다

일부 국가는 관찰의 다른 번호를 가지고 (년 이 경우) 나는 생각한다.

도움을 주시면 큰 도움이 될 것입니다.

Jinseok

+2

내가 뭔가를 수동으로 다양한 형식으로 긴 형식을 변환하는 것은 좋은 생각이 아니다라고 생각합니다. 'tidyr :: spread (your_data, location, value)'는 당신이 원하는 것을 줄 것이다 ('help (spread, tidyr)'를 보라). – cuttlefish44

+0

@ cuttlefish44 와우! 그것은 완벽하게 작동합니다! 고마워. –

답변

0

dplyrtidyr를 사용하는 용액. 핵심은 spread을 사용하여 데이터 프레임을 긴 형식에서 넓은 형식으로 변환하는 것입니다. setNames(sub("location", "value", colnames(.))) 은 열 이름을 원하는 출력과 동일하게 변경하는 것입니다.

library(dplyr) 
library(tidyr) 

dt2 <- dt %>% 
    spread(location, value, sep = "_") %>% 
    setNames(sub("location", "value", colnames(.))) 
dt2 
# year value_aus value_uk value_usa 
# 1 1990   1  3   1 
# 2 1991   2  2   3 
# 3 1992   2  2   2 

데이터

dt <- read.table(text = "location year value 
aus  1990 1 
       aus  1991 2 
       aus  1992 2 
       usa  1990 1 
       usa  1991 3 
       usa  1992 2 
       uk  1990 3 
       uk  1991 2 
       uk  1992 2 
       ", 
       header = TRUE, stringsAsFactors = FALSE) 
관련 문제