2013-08-15 11 views
0

mes codes Rcd ne fonctionnent plus. J'ai le problème discuté ici: segfault in R using reshape2 package and dcastRemodeler les données dans R sans utiliser dcast (reshape2)

Le bug n'a pas encore été corrigé, donc je suis à la recherche d'autres moyens de réaliser ma sortie dcast. Toutes les suggestions seraient grandement appréciées!

Ci-dessous un très petit débit de mon ensemble de données. Fondamentalement, il y a une entrée par espèce par identification d'enquête ("EID"). Je souhaite obtenir une entrée par ID d'enquête ("EID") avec toutes mes espèces en colonnes avec leur valeur associée ("valeur"), c'est-à-dire en format large.

> dput(sample) 
structure(list(EID = c("L00155/69/2000-09-06", "Q99107/178/1999-08-23", 
"G02192/1/2002-07-08", "G97158/1/1997-10-26", "Q06091/2/2006-07-04", 
"L00004/171/2000-03-01", "G11094/15/2011-09-05", "Q04127/16/2004-07-28", 
"Q02122/230/2002-10-29", "G08002/6/2008-02-03", "Q99006/143/1999-02-17", 
"Q08053/3/2008-06-12", "Q99128/22/1999-08-19", "L00177/83/2000-12-18", 
"Q05122/11/2005-08-30", "Q04156/44/2004-10-29", "L01097/69/2001-06-26", 
"G08004/169/2008-05-14", "Q03041/26/2003-06-14", "G98115/60/1998-09-11", 
"G00002/20/2000-01-17", "G00002/20/2000-01-17", "G00054/1/2000-05-31", 
"G00054/1/2000-05-31"), tspp.name = structure(c(13L, 13L, 13L, 
13L, 16L, 13L, 13L, 4L, 13L, 13L, 13L, 13L, 13L, 11L, 4L, 13L, 
13L, 13L, 13L, 20L, 13L, 13L, 24L, 24L), .Label = c("American plaice", 
"American sand lance", "Arctic cod", "Atlantic cod", "Atlantic halibut", 
"Atlantic herring", "Bigeye tuna", "Black dogfish", "Bluefin tuna", 
"Capelin", "Greenland halibut", "Lookdown", "Northern shrimp", 
"Ocean quahog", "Porbeagle", "Redfishes", "Slenteye headlightfish", 
"Smooth flounder", "Spiny dogfish", "Striped pink shrimp", "Summer flounder", 
"White hake", "Winter flounder", "Witch flounder", "Yellowtail flounder" 
), class = "factor"), elasmo.name = structure(c(26L, 30L, 30L, 
30L, 30L, 25L, 21L, 30L, 30L, 30L, 30L, 21L, 30L, 5L, 30L, 30L, 
30L, 21L, 30L, 30L, 14L, 21L, 24L, 21L), .Label = c("Arctic skate", 
"Atlantic sharpnose shark", "Barndoor skate", "Basking shark", 
"Black dogfish", "Blue shark", "Deepsea cat shark", "Greenland shark", 
"Jensen's skate", "Little skate", "Manta", "Ocean quahog", "Oceanic whitetip shark", 
"Porbeagle", "Portuguese shark", "Rough sagre", "Roughtail stingray", 
"Round skate", "Sharks", "Shortfin mako", "Skates", "Smooth skate", 
"Soft skate", "Spiny dogfish", "Spinytail skate", "Thorny skate", 
"White shark", "White skate", "Winter skate", "NA"), class = "factor"), 
    elasmo.discard = c(1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 
    25, 0, 0, 0, 1, 0, 0, 1, 1, 15, 25)), .Names = c("EID", "tspp.name", 
"elasmo.name", "elasmo.discard"), class = "data.frame", row.names = c("18496", 
"488791", "87549", "236671", "139268", "15606", "11132", "115531", 
"93441", "159675", "403751", "42587", "485941", "19285", "130395", 
"119974", "73826", "7953", "99124", "351461", "71", "72", "184", 
"185")) 

A la fin, je souhaite obtenir ceci:

library(plyr) 
test<-dcast(sample, ...~elasmo.name,value.var ="elasmo.discard",fun.aggregate=sum) 
test 

Notez que le code « dcast » fonctionne ici, mais je reçois une erreur fatale quand je le lance sur mon ensemble des données qui a 145349 lignes

Merci beaucoup !!

+2

Ce n'est vraiment pas la bonne façon de poser cette question. Segfaults sont des bogues par définition et doivent être envoyés au mainteneur. Cela pourrait servir dans ce cas puisque l'auteur est un lecteur régulier de SO, mais en général il n'est pas aussi courtois (ou efficace) qu'un e-mail. –

+0

Ok. Merci @DWin, j'espérais que quelqu'un pourrait me fournir une suggestion sur la façon de remodeler mon dataframe sans utiliser dcast. – GodinA

+2

Il est difficile d'aider sans avoir un exemple. – djhurio

Répondre

1

Ce serait la méthode pré-Hadley; premier agrégat pour obtenir les sommes, puis remodeler.

foo <- aggregate(d[,4,drop=FALSE], by=d[,1:3], sum) 
reshape(foo, v.names="elasmo.discard", idvar=c("EID", "tspp.name"), 
      timevar="elasmo.name", direction="wide") 

Si la première partie est lente, il peut être utile d'avoir moins de colonnes dans la partie «par»; il semble que tspp.name est défini par EID, si tel est le cas, ne l'agrégez pas mais ajoutez-le après le fait. Si la deuxième partie est lente, essayez peut-être l'une des méthodes ici: https://stackoverflow.com/a/9617424/210673.

Pour obtenir une meilleure aide sur l'accélération, fournissez un exemple approprié (peut-être en utilisant un échantillon ou un représentant) sur lequel le code peut être testé. La vitesse de la solution dépend souvent du nombre de combinaisons uniques de chaque variable.

+0

Merci @Aaron, j'essaie de l'utiliser sur mon dataset mais j'ai quelques problèmes ... que signifie drop = F? – GodinA

+0

Cela le garde juste comme une trame de données à une seule colonne au lieu d'un simple vecteur; la raison en est que le nom de la colonne est préservé. – Aaron

+0

merci! Ca marche ... cependant, ça prend du calme quelques fois! Toutes les façons que je pourrais le faire plus vite? – GodinA

0

Je ne parviens pas à reproduire l'erreur. Voir le code ci-joint. J'ai augmenté le numéro de ligne de sample à 196608.

Probablement le nombre de catégories dans sample$elasmo.name joue un rôle.

library(reshape2) 

sample <- structure(list(EID = c("L00155/69/2000-09-06", "Q99107/178/1999-08-23", 
    "G02192/1/2002-07-08", "G97158/1/1997-10-26", "Q06091/2/2006-07-04", 
    "L00004/171/2000-03-01", "G11094/15/2011-09-05", "Q04127/16/2004-07-28", 
    "Q02122/230/2002-10-29", "G08002/6/2008-02-03", "Q99006/143/1999-02-17", 
    "Q08053/3/2008-06-12", "Q99128/22/1999-08-19", "L00177/83/2000-12-18", 
    "Q05122/11/2005-08-30", "Q04156/44/2004-10-29", "L01097/69/2001-06-26", 
    "G08004/169/2008-05-14", "Q03041/26/2003-06-14", "G98115/60/1998-09-11", 
    "G00002/20/2000-01-17", "G00002/20/2000-01-17", "G00054/1/2000-05-31", 
    "G00054/1/2000-05-31"), tspp.name = structure(c(13L, 13L, 13L, 
    13L, 16L, 13L, 13L, 4L, 13L, 13L, 13L, 13L, 13L, 11L, 4L, 13L, 
    13L, 13L, 13L, 20L, 13L, 13L, 24L, 24L), .Label = c("American plaice", 
    "American sand lance", "Arctic cod", "Atlantic cod", "Atlantic halibut", 
    "Atlantic herring", "Bigeye tuna", "Black dogfish", "Bluefin tuna", 
    "Capelin", "Greenland halibut", "Lookdown", "Northern shrimp", 
    "Ocean quahog", "Porbeagle", "Redfishes", "Slenteye headlightfish", 
    "Smooth flounder", "Spiny dogfish", "Striped pink shrimp", "Summer flounder", 
    "White hake", "Winter flounder", "Witch flounder", "Yellowtail flounder" 
), class = "factor"), elasmo.name = structure(c(26L, 30L, 30L, 
    30L, 30L, 25L, 21L, 30L, 30L, 30L, 30L, 21L, 30L, 5L, 30L, 30L, 
    30L, 21L, 30L, 30L, 14L, 21L, 24L, 21L), .Label = c("Arctic skate", 
    "Atlantic sharpnose shark", "Barndoor skate", "Basking shark", 
    "Black dogfish", "Blue shark", "Deepsea cat shark", "Greenland shark", 
    "Jensen's skate", "Little skate", "Manta", "Ocean quahog", "Oceanic whitetip shark", 
    "Porbeagle", "Portuguese shark", "Rough sagre", "Roughtail stingray", 
    "Round skate", "Sharks", "Shortfin mako", "Skates", "Smooth skate", 
    "Soft skate", "Spiny dogfish", "Spinytail skate", "Thorny skate", 
    "White shark", "White skate", "Winter skate", "NA"), class = "factor"), 
     elasmo.discard = c(1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 
     25, 0, 0, 0, 1, 0, 0, 1, 1, 15, 25)), .Names = c("EID", "tspp.name", 
    "elasmo.name", "elasmo.discard"), class = "data.frame", row.names = c("18496", 
    "488791", "87549", "236671", "139268", "15606", "11132", "115531", 
    "93441", "159675", "403751", "42587", "485941", "19285", "130395", 
    "119974", "73826", "7953", "99124", "351461", "71", "72", "184", 
    "185")) 

n <- nrow(sample) 
N <- 145349 
p <- ceiling(log2(N/n)) 
n * 2^p 
n * 2^p > N 

# Bad way of increasing the row number 
for (i in 1:p) sample <- rbind(sample, sample) 

nrow(sample) 

class(sample) 
head(sample) 

table(sample$elasmo.name) 
table(as.character(sample$elasmo.name)) 

test <- dcast(sample, ... ~ elasmo.name, 
       value.var = "elasmo.discard", 
       fun.aggregate = sum) 
head(test) 
+0

hummm ... intéressant @djhurio. Je vais regarder dans un peu plus. Pas sûr de ce qui ne va pas! – GodinA

Questions connexes