2014-12-30 5 views
0

데이터 프레임의 모양을 변경하려고합니다. 그것은 4 개의 열을 가지고 있습니다 : 나는 그 중 3 개를 결합하고 하나를 유지하고 싶습니다.열을 결합하고 유지하는 가장 좋은 방법은 무엇입니까?

year x1 
2000 4 
2000 3 
2000 9 
2000 1 
2000 4 
2000 2 
2002 4 
2002 3 
2002 7 

나는 실제로 몇 가지 예를 읽어

year x1 x2 x3 
2000 4 3 9 
2000 1 4 2 
2002 4 3 7 

이는 모양 변경 후 어떻게 보일지입니다 :

이는 모습입니다 : 그것은 예제를 이해하는 것이 더 쉬울 것입니다 열을 결합하고 변환하는 방법은 내가 할 수있는 유일한 방법은 함수를 작성하는 것입니다. 더 쉬운 방법이 있다는 것을 확신합니다. 그래서 누구든지 그 문제를 도와 줄 수 있습니까?

미리 감사드립니다.

+1

하나 더 :'cbind (df [1], x1 = unlist (df [2 : 4])) ' –

답변

2

당신은

data.frame(year=rep(df$year,each=length(df)-1),x1=c(t(df[,-1]))) 

시도하거나 reshape2에서 melt를 사용할 수 있습니다. 그러나, 그것은 tidyr 패키지에서 gather()을 사용하여 다른 순서

library(reshape2) 
melt(df, id.var='year')[,-2] 
2

에 결과를 줄 것이다 dplyr 당신이 할 수있는 (하지만 다른 순서로 결과를 얻을 것이다) :

library(tidyr) 
library(dplyr) 

df %>% 
    gather(variable, value, -year) %>% 
    arrange(year) 

당신은 것 수 :

year variable value 
1 2000  x1  4 
2 2000  x1  1 
3 2000  x2  3 
4 2000  x2  4 
5 2000  x3  9 
6 2000  x3  2 
7 2002  x1  4 
8 2002  x2  3 
9 2002  x3  7 

당신이 변수 이름을 제거 만 값을 유지 얻을하려는 경우 :

df %>% 
    gather(variable, value, -year) %>% 
    select(-variable) %>% 
    arrange(year) 

당신은 얻을 것이다 :

year value 
1 2000  4 
2 2000  1 
3 2000  3 
4 2000  4 
5 2000  9 
6 2000  2 
7 2002  4 
8 2002  3 
9 2002  7 
2

또한 기본 R의 모양 변경하여이 작업을 수행 할 수 있습니다

reshape(mydf, direction = "long", varying = 2:ncol(mydf), sep = "") 
#  year time x id 
# 1.1 2000 1 4 1 
# 2.1 2000 1 1 2 
# 3.1 2002 1 4 3 
# 1.2 2000 2 3 1 
# 2.2 2000 2 4 2 
# 3.2 2002 2 3 3 
# 1.3 2000 3 9 1 
# 2.3 2000 3 2 2 
# 3.3 2002 3 7 3 

또는 내 "splitstackshape"패키지에서 merged.stack와 (하지만 당신은 확인해야 귀하의 "id"열은 고유합니다).

library(splitstackshape) 
merged.stack(getanID(mydf, "year"), var.stubs = "x", sep = "var.stubs") 
# year .id .time_1 x 
# 1: 2000 1  1 4 
# 2: 2000 1  2 3 
# 3: 2000 1  3 9 
# 4: 2000 2  1 1 
# 5: 2000 2  2 4 
# 6: 2000 2  3 2 
# 7: 2002 1  1 4 
# 8: 2002 1  2 3 
# 9: 2002 1  3 7 

는 ".ID"와 ".time_1"열을 삭제하려는 경우가 merged.stack(getanID(mydf, "year"), var.stubs = "x", sep = "var.stubs")[, c("year", "x"), with = FALSE]를 사용할 수 있습니다.

+0

이제부터는 이런 종류의 작업을 위해 "splitstackshape"를 사용할 것입니다. 훌륭한 패키지를 가져 주셔서 감사합니다. –

관련 문제