2013-08-15 3 views
0

Мои dcast Rcodes больше не работают. У меня есть проблема, обсуждаемая здесь: segfault in R using reshape2 package and dcastИзменение формы данных в R без использования dcast (reshape2)

Ошибка еще не исправлена, поэтому я ищу другие способы достижения моего вывода dcast. Любые предложения будут ценны!

Ниже очень небольшой объем моего набора данных. В принципе, для каждого идентификатора обследования («EID») имеется одна запись на каждого вида. Я хотел бы получить одну запись для каждого идентификатора опроса («EID») со всеми моими видами в виде столбцов с их ассоциированным значением («значение»), то есть в широком формате.

> 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")) 

В конце концов, я хотел бы получить это:

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

Обратите внимание, что «dcast» код здесь работает, но я получаю фатальную ошибку, когда я запускаю его на мой общий набор данных, который имеет 145349 строк.

Большое спасибо!

+2

Это действительно неправильный способ задать этот вопрос. Segfaults являются ошибками по определению и должны быть отправлены сопровождающему. Это может служить этой цели в этом случае, поскольку автор является обычным SO-читателем, но в целом он не является таким вежливым (или эффективным), как электронное письмо. –

+0

Хорошо. Спасибо @DWin, я надеялся, что кто-то может дать мне предложение о том, как изменить форму данных без использования dcast. – GodinA

+2

Трудно помочь, не имея примера. – djhurio

ответ

1

Это будет метод до Хэдли; первый агрегат, чтобы получить суммы, затем измените форму.

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") 

Если первая часть работает медленно, это может помочь уменьшить количество столбцов в части «by»; похоже, что tspp.name определяется EID, если да, не агрегируйте его, а вместо этого добавьте его после факта.

Если вторая часть работает медленно, попробуйте использовать один из способов здесь: https://stackoverflow.com/a/9617424/210673.

Чтобы получить лучшую помощь в ускорении, предоставьте соответствующий пример (возможно, используя образец или rep), на котором может быть проверен код. Скорость решения часто зависит от количества уникальных комбинаций каждой переменной.

+0

Спасибо @Aaron, я пытаюсь использовать его в моем наборе данных, но у меня есть некоторые проблемы ... что означает drop = F? – GodinA

+0

Это просто хранит его как единый кадр данных вместо простого вектора; причина в том, что имя столбца сохраняется. – Aaron

+0

спасибо! Он работает ... однако, он немного успокаивается! Любые способы, чтобы я мог сделать это быстрее? – GodinA

0

Я не могу воспроизвести ошибку. См. Прилагаемый код. Я увеличил номер строки sample до 196608.

Возможно, количество категорий в sample$elasmo.name играет определенную роль.

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 ... интересный @djhurio. Я посмотрю на это немного больше. Не уверен, что происходит не так! – GodinA

Смежные вопросы