Signification de l'erreur ddply: l'attribut "names" [9] doit avoir la même longueur que le vecteur [1]

je passe par L'apprentissage Machine pour les Hackers, et je suis coincé à cette ligne:

from.weight <- ddply(priority.train, .(From.EMail), summarise, Freq = length(Subject))

Qui génère l'erreur suivante:

Error in attributes(out) <- attributes(col) : 
  'names' attribute [9] must be the same length as the vector [1]

C'est un traceback():

> traceback()
11: FUN(1:5[[1L]], ...)
10: lapply(seq_len(n), extract_col_rows, df = x, i = i)
9: extract_rows(x$data, x$index[[i]])
8: `[[.indexed_df`(pieces, i)
7: pieces[[i]]
6: function (i) 
   {
       piece <- pieces[[i]]
       if (.inform) {
           res <- try(.fun(piece, ...))
           if (inherits(res, "try-error")) {
               piece <- paste(capture.output(print(piece)), collapse = "n")
               stop("with piece ", i, ": n", piece, call. = FALSE)
           }
       }
       else {
           res <- .fun(piece, ...)
       }
       progress$step()
       res
   }(1L)
5: .Call("loop_apply", as.integer(n), f, env)
4: loop_apply(n, do.ply)
3: llply(.data = .data, .fun = .fun, ..., .progress = .progress, 
       .inform = .inform, .parallel = .parallel, .paropts = .paropts)
2: ldply(.data = pieces, .fun = .fun, ..., .progress = .progress, 
       .inform = .inform, .parallel = .parallel, .paropts = .paropts)
1: ddply(priority.train, .(From.EMail), summarise, Freq = length(Subject))

la priorité.train object est une base de données, et voici plus d'informations:

> mode(priority.train)
[1] "list"
> names(priority.train)
[1] "Date"       "From.EMail" "Subject"    "Message"    "Path"      
> sapply(priority.train, mode)
       Date  From.EMail     Subject     Message        Path 
     "list" "character" "character" "character" "character" 
> sapply(priority.train, class)
$Date
[1] "POSIXlt" "POSIXt" 

$From.EMail
[1] "character"

$Subject
[1] "character"

$Message
[1] "character"

$Path
[1] "character"

> length(priority.train)
[1] 5
> nrow(priority.train)
[1] 1250
> ncol(priority.train)
[1] 5
> str(priority.train)
'data.frame':   1250 obs. of  5 variables:
 $ Date      : POSIXlt, format: "2002-01-31 22:44:14" "2002-02-01 00:53:41" "2002-02-01 02:01:44" "2002-02-01 10:29:23" ...
 $ From.EMail: chr  "removed@removed.ca" "removed@removed.net" "removed@removed.ca" "removed@removed.net" ...
 $ Subject   : chr  "please help a newbie compile mplayer :-)" "re: please help a newbie compile mplayer :-)" "re: please help a newbie compile mplayer :-)" "re: please help a newbie compile mplayer :-)" ...
 $ Message   : chr  "    n Hello,n   n         I just installed redhat 7.2 and I think I have everything nworking properly.  Anyway I want to in"| __truncated__ "Make sure you rebuild as root and you're in the directory that youndownloaded the file.  Also it might complain of a few depen"| __truncated__ "Lance wrote:nn>Make sure you rebuild as root and you're in the directory that youn>downloaded the file.  Also it might compl"| __truncated__ "Once upon a time, rob wrote :nn>  I dl'd gcc3 and libgcc3, but I still get the same error message when I n> try rpm --rebuil"| __truncated__ ...
 $ Path      : chr  "../03-Classification/data/easy_ham/01061.6610124afa2a5844d41951439d1c1068" "../03-Classification/data/easy_ham/01062.ef7955b391f9b161f3f2106c8cda5edb" "../03-Classification/data/easy_ham/01063.ad3449bd2890a29828ac3978ca8c02ab" "../03-Classification/data/easy_ham/01064.9f4fc60b4e27bba3561e322c82d5f7ff" ...
Warning messages:
1: In encodeString(object, quote = """, na.encode = FALSE) :
  it is not known that wchar_t is Unicode on this platform
2: In encodeString(object, quote = """, na.encode = FALSE) :
  it is not known that wchar_t is Unicode on this platform

je voudrais poster un échantillon, mais le contenu est un peu long et je ne pense pas que le contenu est pertinent ici.

la même erreur se produit aussi ici:

> ddply(priority.train, .(Subject))
Error in attributes(out) <- attributes(col) : 
  'names' attribute [9] must be the same length as the vector [1]

quelqu'un a une idée sur ce qui se passe ici? L'erreur semble être généré par un objet différent de priorité.train, parce que son attribut names comporte apparemment 9 éléments.

j'apprécierais toute aide. Merci!

Problème résolu

j'ai trouvé le problème grâce à l'astuce de @user1317221_G d'utiliser le dput fonction. Le problème est avec le champ de Date, qui est à ce point une liste qui contient des 9 champs (sec, min, heure, mday, lundi, à l'année, wday, yday, isdst). Pour résoudre le problème, j'ai simplement converti les dates en Vecteurs de caractères, utilisé ddply puis converti les dates à partir de Date:

> tmp <- priority.train$Date
> priority.train$Date <- as.character(priority.train$Date)
> from.weight <- ddply(priority.train, .(From.EMail), summarise, Freq = length(Subject))
> priority.train$Date <- tmp
> rm(tmp)
37
demandé sur flodel 2013-01-04 11:40:03

7 réponses

j'ai corrigé ce problème que j'avais en convertissant le format de POSIXlt en POSIXct comme Hadley suggère ci - dessus-une ligne de code:

    mydata$datetime<-strptime(mydata$datetime, "%Y-%m-%d %H:%M:%S") # original conversion from datetime string : > class(mydata$datetime) [1] "POSIXlt" "POSIXt" 
    mydata$datetime<-as.POSIXct(mydata$datetime) # convert to POSIXct to use in data frames / ddply
42
répondu c.gutierrez 2013-02-02 03:58:02

vous avez probablement déjà vu ce et cela n'a pas aidé. Je suppose que nous n'avez probablement pas encore de réponse parce que les gens ne peuvent pas reproduire l'erreur.

Un dput ou le petit head(dput()) pourrait aider à cela. Mais voici une alternative en utilisant base :

x <- data.frame(A=c("a","b","c","a"),B=c("e","d","d","d"))

ddply(x,.(A),summarise, Freq = length(B))
  A Freq
1 a    2
2 b    1
3 c    1

 tapply(x$B,x$A,length)
a b c 
2 1 1 

est-ce que tapply fonctionne pour vous?

x2 <- data.frame(A=c("removed@removed.ca", "removed@removed.net"),
                 B=c("please help a newbie compile mplayer :-)", 
                     "re: please help a newbie compile mplayer :-)"))

tapply(x2$B,x2$A,length)
removed@removed.ca removed@removed.net 
              1                   1 

ddply(x2,.(A),summarise, Freq = length(B))
                    A Freq
1  removed@removed.ca    1
2 removed@removed.net    1

, vous pouvez aussi essayer plus simplement:

table(x2$A)

 removed@removed.ca removed@removed.net 
              1                   1 
6
répondu user1317221_G 2017-05-23 12:03:02

j'ai eu un problème très similaire, mais pas sûr s'il est identique. J'ai reçu le message d'erreur ci-dessous.

Error in attributes(out) <- attributes(col) : 
  'names' attribute [20388] must be the same length as the vector [128]

Je n'ai pas de variable en mode Liste, donc la solution de Mota ne fonctionne pas sur ma situation. La façon dont j'ai trié le problème est de supprimer plyr 1,8 et installer manuellement plyr 1.7. L'erreur est alors disparu. J'ai aussi essayé de réinstaller plyr 1,8 et reproduit le problème.

HTH.

4
répondu Yishin Lin 2013-01-04 17:58:46

j'ai fait face à un problème similaire avec ddply aussi bien et ai donné le code/erreur ci-dessous:

    test <- ddply(test, "catColumn", function(df) df[1:min(nrow(df), 3),])
    Error: 'names' attribute [11] must be the same length as the vector [2]

il y avait pas mal de variables catégoriques dans le "test" de la base de données.

conversion des variables catégoriques en variables de caractères comme suit a fait fonctionner la commande ddply:

    test <- data.frame(lapply(test, as.character), stringsAsFactors=FALSE)
3
répondu Ravi 2014-07-30 09:13:41

une fois que vous comprenez que c'est une colonne date qui interfère, vous pouvez aussi simplement laisser cette colonne en dehors lorsque vous exécutez la commande plutôt que de la convertir...

donc

from.weight <- ddply(priority.train, .(From.EMail), summarise, Freq = length(Subject))

peut devenir

from.weight <- ddply(priority.train[,c(1:7,9:10)], .(From.EMail), summarise, Freq = length(Subject))

si par exemple la date POSIXlt se trouve dans la colonne 8 de la base de données. Ce qui est bizarre avec l'erreur signalée, c'est qu'elle n'a peut-être rien à voir avec ce que vous tentez de grouper. par ou ce que vous cherchez comme informations de sortie...

2
répondu Chuck 2015-07-14 18:05:25

j'ai eu le même problème en utilisant ddply et je l'ai corrigé avec doBy

library(doBy) 
bylength = function(x){length(x)} 
newdt = bylength(X ~From.EMail + To.EMail, data = dt, FUN = bylength)
1
répondu Vanessa 2015-03-24 21:37:26

j'ai aussi fait face au même problème, je le résous en gardant seulement les données requises pour ddply et en convertissant la variable de filtre et toutes les variables de texte requises au caractère en utilisant as.caractère

ça a marché

0
répondu Nts 2016-02-12 05:42:30