2015-01-19 2 views
-1

원본 데이터 프레임에는 ID, 유형 및 순위가 3 열입니다. 지금은 내가 그렇게 한 일이다 즉 새로운 데이터 프레임을 하나의 열로 유형의 각 가능한 값을 갖는 (아래의 작은 예는, 원래의 데이터가> 100.000 행과 30 유형이 포함 참조)R : 행과 열의 모양을 바꿉니다.

data1 
id type rank 
x a  1 
y a  2 
z a  3 
x b  1 
z b  2 
y c  1  

data2 
id a b c 
x 1 1 NA 
y 2 NA 1 
z 3 2 NA 

을 만들려면 멀리 :

for (i in (1:nrow(data1))) { 
    dtype <- data[i,2] 
    if (any(data2$id == data1[i,1], na.rm = TRUE)) { 
    row <- grep(data1[i,1],data2$id) 
    data2[row,c(dtype)] <- data1[i,3] 
    } else { 
    data2[nrow(data2)+1,1] <- as.character(data1[i,1]) 
    data2[nrow(data2),c(dtype)] <- data1[i,3] 
} 
} 

이 예가 효과적이지만 (이 예제가 내가하는 일을 설명하기를 바란다.) 아주 느리다. 이 알고리즘을 최적화 할 수있는 힌트가 있습니까?

+0

은 "ID"독특한인가 모든 100k 행에 대해 또는 해당 열에 중복 값이 ​​있습니까? – A5C1D2H2I1M1N2O1R2T1

답변

3

다음은 tidyr 패키지의 예입니다. 귀하의 질문에 언급 된 말씀으로 기능을 사용

library("tidyr") 
library("dplyr") 
data2<- 
    data1 %>% spread(type, rank) 

    id a b c 
1 x 1 1 NA 
2 y 2 NA 1 
3 z 3 2 NA 
4

, 당신은 단지 기본 R에서 reshape를 사용할 수 있습니다 data.table를 사용하고

다음
> reshape(mydf, direction = "wide", idvar = "id", timevar = "type") 
    id rank.a rank.b rank.c 
1 x  1  1  NA 
2 y  2  NA  1 
3 z  3  2  NA 
3

:

require(data.table) 
ans = dcast.data.table(setDT(data1), id ~ type) 
ans 
# id a b c 
# 1: x 1 1 NA 
# 2: y 2 NA 1 
# 3: z 3 2 NA