2012-03-19 5 views
-1

데이터 프레임을 재구성하기 위해 reshape_longreshape_wide (아래의 전체 작동 예제 참조) 기능을 구현했습니다. 몇 가지 작은 예제를 만들었고 두 함수가 제대로 작동하는 것처럼 보였습니다.dcast와 melt로 데이터 프레임을 변형하십시오.

그러나 reshape_wide 기능 을 실제 데이터 세트 (약 200.000 - 300.000 행)에 사용하면 오류가 발생합니다. 무슨 일이 일어나는지는 X, Y, Z의 모든 값을 1로 설정 한 것입니다. 실제 데이터의 구조는 아래의 작은 예와 똑같습니다. 2 일 동안 작업 한 후에 나는 문제는 "기본 키"(test_name, group_nameid)가 넓은 형태로만 유일하다는 것입니다. reshape_long 함수를 적용하면 기본 키가 더 이상 고유하지 않습니다. 궁금한데, 아무도 나에게 d1 -> reshape_wide -> d2의 단계가 d1의 유일하지 않음 때문에 전혀 작동 할 수 있는지 여부를 말해 줄 수 있습니까?

library(reshape2) 
library(taRifx) 

reshape_long <- function(data, ids) {  
     # Bring data into long form 
     data_long <- melt(data, id.vars = ids, 
          variable.name="Data_Points", value.name="value") 
     data_long$value <- as.numeric(data_long$value) 
     # Remove rows were analyte value is NA 
     data_long <- data_long[!is.na(data_long$value), ] 
     # Resort data 
     formula_sort <- as.formula(paste("~", paste(ids, collapse="+"))) 
     data_long <- sort(data_long, f = formula_sort) 
     return(data_long) 
} 

reshape_wide <- function(data, ids) { 
     # Bring data into wide form 
     formula_wide <- as.formula(paste(paste(ids, collapse="+"), 
            "~ Data_Points")) 
     data_wide <- dcast(data, formula_wide) 
     # Resort data 
     formula_sort <- as.formula(paste("~", paste(ids, collapse="+"))) 
     data_wide <- sort(data_wide, f = formula_sort) 
     return(data_wide) 
} 

d <- data.frame( 
     test_name = c(rep("Test_A", 6), rep("Test_B", 6)), 
     group_name = c(rep("Group_C", 3), rep("Group_D", 3), 
         rep("Group_C", 3), rep("Group_D", 3)), 
     id = c("I1", "I2", "I3", "I4", "I5", "I6",       
       "I1", "I2", "I3", "I7", "I8", "I9"), 
     X = c(NA,NA,1,2,3,4,5,6,NA,7,8,9), 
     Y = as.numeric(10:21), 
     Z = c(NA,22,23,NA,24,NA,25,26,NA,27,28,29) 
) 

d 
d1 <- reshape_long(d, ids=c("test_name", "group_name", "id")) 
d1 
d2 <- reshape_wide(d1, ids=c("test_name", "group_name", "id")) 
d2 

identical(d,d2) 

답변

1

당신이 당신의 기능을 작성한 방법은, (당신의 예에서 test_name, group_nameid) ids의 조합이 원본 데이터에서 고유한지 가정이있다. 이를 확인하는 가장 쉬운 방법은 d 및 중복 행을 가져 오는 것입니다. 당신의 reshape_wide이 함께 idsData_Points 고유 있다고 가정

> ddup <- rbind(d,d) 
> ddup1 <- reshape_long(ddup, ids=c("test_name", "group_name", "id")) 
> ddup2 <- reshape_wide(ddup1, ids=c("test_name", "group_name", "id")) 
Aggregation function missing: defaulting to length 
> 
> identical(ddup,ddup2) 
[1] FALSE 

참고. 이 예제에서는 그렇지 않습니다. 경고 메시지는 dcastlength을 사용하여 각 조합의 여러 값을 단일 값으로 요약했음을 나타냅니다.

관련 문제