significado del error ddply: el atributo ‘nombres’ debe tener la misma longitud que el vector

Estoy pasando por Machine Learning for Hackers, y estoy atrapado en esta línea:

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

Lo cual genera el siguiente error:

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

Este es 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)) 

El objeto priority.train es un dataframe, y aquí hay más información:

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

Publicaba una muestra, pero el contenido es un poco largo y no creo que el contenido sea relevante aquí.

El mismo error también sucede aquí:

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

¿Alguien tiene una pista sobre lo que está pasando aquí? El error parece ser generado por un objeto diferente de priority.train, porque su atributo de nombres aparentemente tiene 9 elementos.

Agradecería cualquier ayuda. ¡Gracias!

Problema resuelto

He encontrado el problema gracias al consejo de @ user1317221_G de usar la función dput. El problema es con el campo Fecha, que es en este punto una lista que contiene 9 campos (sec, min, hour, mday, mon, year, wday, yday, isdst). Para resolver el problema simplemente he convertido las fechas en vectores de caracteres, usé ddply y luego convertí las fechas a Fecha:

 > tmp  priority.train$Date  from.weight  priority.train$Date  rm(tmp) 

Solucioné este problema que tenía al convertir el formato de POSIXlt a POSIXct como Hadley sugiere más arriba: una línea de código:

  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 

Probablemente ya hayas visto esto y no haya ayudado. Supongo que probablemente aún no tengamos una respuesta porque la gente no puede reproducir su error.

Un dput o una head(dput()) más pequeña head(dput()) podría ayudar. Pero aquí hay una alternativa que usa 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) abc 2 1 1 

¿ tapply esto para ti?

 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 

también puedes probar más simplemente:

 table(x2$A) removed@removed.ca removed@removed.net 1 1 

Tuve un problema muy similar, aunque no estoy seguro de si es idéntico. Recibí el error a continuación.

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

No tengo ninguna variable en modo lista, por lo que la solución de Mota no funciona en mi situación. La forma en que ordené el problema es eliminar plyr 1.8 e instalar manualmente plyr 1.7. El error se ha ido. También intenté reinstalar plyr 1.8 y repliqué el problema.

HTH.

Me enfrenté a un problema similar con ddply y le di el siguiente código / error:

  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] 

Hubo bastantes variables categóricas en el dataframe 'prueba'.

La conversión de las variables categóricas a las variables de caracteres de la siguiente manera hizo que el comando ddply funcionara:

  test <- data.frame(lapply(test, as.character), stringsAsFactors=FALSE) 

Una vez que comprenda que es esa columna de fecha que está interfiriendo, también puede simplemente dejar esa columna cuando ejecuta el comando en lugar de convertirlo …

asi que

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

puede llegar a ser

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

si, por ejemplo, la fecha POSIXlt pasa a estar en la columna 8 del dataframe. Lo extraño del error informado es que puede no tener nada que ver con lo que intenta agrupar o con lo que busca como información de salida ...

Tuve el mismo problema al usar ddply y lo solucioné con doBy

 library(doBy) bylength = function(x){length(x)} newdt = bylength(X ~From.EMail + To.EMail, data = dt, FUN = bylength) 

También me he enfrentado al mismo problema, lo resuelvo manteniendo solo los datos requeridos para ddply y convirtiendo la variable de filtro y todas las variables de texto requeridas en caracteres usando as.character

funcionó