Je passe en revue Machine Learning for Hackers, et je suis bloqué à cette ligne:
from.weight <- ddply(priority.train, .(From.EMail), summarise, Freq = length(Subject))
Ce 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]
Ceci est une 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))
L'objet priority.train est un bloc 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 "[email protected]" "[email protected]" "[email protected]" "[email protected]" ...
$ 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 you\ndownloaded the file. Also it might complain of a few depen"| __truncated__ "Lance wrote:\n\n>Make sure you rebuild as root and you're in the directory that you\n>downloaded the file. Also it might compl"| __truncated__ "Once upon a time, rob wrote :\n\n> 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]
Est-ce que quelqu'un a une idée de ce qui se passe ici? L'erreur semble être générée par un objet différent de priority.train, car son attribut de noms comporte apparemment 9 éléments.
J'apprécierais toute aide. Merci!
Problème résolu
J'ai trouvé le problème grâce au conseil de @ user1317221_G concernant l'utilisation de la fonction dput. Le problème concerne le champ Date, qui contient à présent une liste de 9 champs (sec, min, heure, jour, jour, année, jour, jour, jour, heure). Pour résoudre le problème, j'ai simplement converti les dates en vecteurs de caractères, puis utilisé ddply puis converti les dates en 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)
J'ai résolu le problème que je rencontrais en convertissant le format POSIXlt en POSIXct comme Hadley le 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 cela et cela n'a pas aidé. Je suppose que nous n'avons probablement pas encore de réponse car les gens ne peuvent pas reproduire votre erreur.
dput
ou plus petit head(dput())
pourrait aider Mais voici une alternative 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 cette tapply
fonctionne pour vous?
x2 <- data.frame(A=c("[email protected]", "[email protected]"),
B=c("please help a newbie compile mplayer :-)",
"re: please help a newbie compile mplayer :-)"))
tapply(x2$B,x2$A,length)
[email protected] [email protected]
1 1
ddply(x2,.(A),summarise, Freq = length(B))
A Freq
1 [email protected] 1
2 [email protected] 1
vous pouvez aussi essayer plus simplement:
table(x2$A)
[email protected] [email protected]
1 1
J'ai eu un problème très similaire, bien que pas sûr si c'est un identique. J'ai reçu l'erreur ci-dessous.
Error in attributes(out) <- attributes(col) :
'names' attribute [20388] must be the same length as the vector [128]
Je n'ai aucune variable en mode liste, donc la solution de Mota ne fonctionne pas dans ma situation. La façon dont j'ai réglé le problème est de supprimer plyr 1.8 et d'installer manuellement plyr 1.7. L'erreur est alors parti. J'ai également essayé de réinstaller plyr 1.8 et de répliquer le problème.
HTH.
J'ai également rencontré un problème similaire avec ddply et j'ai donné le code/l'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.
La conversion des variables catégorielles en variables de caractères comme suit permet à la commande ddply de fonctionner:
test <- data.frame(lapply(test, as.character), stringsAsFactors=FALSE)
Une fois que vous avez compris que c’est une colonne de date qui interfère, vous pouvez également simplement laisser cette colonne de côté lorsque vous exécutez la commande plutôt que de la convertir ...
alors
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 du cadre de données. Ce qui est étrange avec l’erreur rapportée, c’est qu’elle n’a peut-être rien à voir avec ce que vous souhaitez grouper ou avec ce que vous recherchez 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 également fait face au même problème, je le résous en ne conservant que les données requises pour ddply et en convertissant la variable de filtre et toutes les variables de texte requises en caractères à l'aide de as.character.
ça a marché