2012-03-19 3 views
-1

データフレームを再形成するために、reshape_longreshape_wideという2つの関数を実装しました(以下の完全な動作例を参照)。 私はいくつかの小さな例を作成し、2つの関数が適切に動作するように見えました。dcastとmeltでデータフレームを整形する

しかし、reshape_wideファンクション を実際のデータセット(約200.000〜300.000行)に使用すると失敗しました。何が起こるかは、X、Y、Zのすべての値が1に設定されているということです。 私の実際のデータの構造は、以下の小さな例とまったく同じように見えます。 2日間作業した後、私は の問題は、 "プライマリキー"(test_namegroup_nameおよびid)がワイドフォームでのみ一意であるということです。 reshape_long関数を適用すると、主キーはもはや一意ではなくなります。私は疑問に思っていましたが、の非一意性のために、d1 -> reshape_wide -> d2のステップ が全く動作するかどうかは誰にも分かりますか?

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_namegroup_name、およびididsの組み合わせは、元のデータで一意であるという仮定があります。これを確認する最も簡単な方法は、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を使用して、各組み合わせの複数の値を1つの値にまとめることを示しています。

関連する問題