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)
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
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
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.
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)
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...
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)
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é