Значение ошибки ddply: атрибут 'names' [9] должен быть такой же длины, как и вектор [1]
Я разбираюсь в Machine Learning для хакеров, и я застрял в этой строке:
from.weight <- ddply(priority.train, .(From.EMail), summarise, Freq = length(Subject))
Что генерирует следующую ошибку:
Error in attributes(out) <- attributes(col) :
'names' attribute [9] must be the same length as the vector [1]
Это 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))
Объект priority.train является фреймом данных, и здесь больше информации:
> 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
Я бы опубликовал образец, но контент немного длинный, и я не думаю, что контент здесь имеет значение.
То же самое происходит и здесь:
> ddply(priority.train, .(Subject))
Error in attributes(out) <- attributes(col) :
'names' attribute [9] must be the same length as the vector [1]
Кто-нибудь знает, что происходит здесь? Кажется, что ошибка генерируется другим объектом, чем priority.train, потому что атрибут имен, по-видимому, имеет 9 элементов.
Буду признателен за любую помощь. Спасибо!
Задача решена
Я нашел проблему благодаря подсказке @user1317221_G использования функции dput. Проблема заключается в поле Date, которое в этот момент содержит список, содержащий 9 полей (сек, мин, час, день, день, день, день, день, идст). Чтобы решить проблему, я просто преобразовал даты в символьные векторы, использовал ddply, а затем преобразовал даты в 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)
Ответы
Ответ 1
Я исправил эту проблему, которую я получал, преобразовывая формат с POSIXlt в POSIXct, поскольку Хэдли предлагает выше - одну строку кода:
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
Ответ 2
Возможно, вы уже видели , и это не помогло. Наверное, у нас, вероятно, еще нет ответа, потому что люди не могут воспроизвести вашу ошибку.
A dput
или меньше head(dput())
может помочь в этом. Но вот альтернатива, использующая 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
Работает ли это tapply
для вас?
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
вы также можете попробовать более просто:
table(x2$A)
[email protected] [email protected]
1 1
Ответ 3
У меня была очень похожая проблема, хотя я не уверен, что она такая же. Я получил ошибку ниже.
Error in attributes(out) <- attributes(col) :
'names' attribute [20388] must be the same length as the vector [128]
У меня нет переменной в режиме списка, поэтому решение Моты не работает в моей ситуации. То, как я отсортировал проблему, - удалить plyr 1.8 и вручную установить plyr 1.7. Ошибка исчезла. Я также попытался переустановить plyr 1.8 и реплицировал проблему.
НТН.
Ответ 4
Я столкнулся с аналогичной проблемой с ddply, а также дал код/ошибку ниже:
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]
В тесте dataframe было всего несколько категориальных переменных.
Преобразование категориальных переменных в переменные символов следующим образом заставило команду ddply работать:
test <- data.frame(lapply(test, as.character), stringsAsFactors=FALSE)
Ответ 5
Как только вы поймете, что это один столбец даты, который мешает вам, вы также можете просто оставить этот столбец, когда вы запустите команду, а не конвертируете ее...
так
from.weight <- ddply(priority.train, .(From.EMail), summarise, Freq = length(Subject))
может стать
from.weight <- ddply(priority.train[,c(1:7,9:10)], .(From.EMail), summarise, Freq = length(Subject))
если, например, дата POSIXlt находится в столбце 8 фрейма данных. Что странно в отношении сообщенной ошибки, так это то, что она не может иметь ничего общего ни с тем, что вы пытаетесь группировать, так и по тому, что вы ищете в качестве выходной информации...
Ответ 6
У меня была такая же проблема при использовании ddply
и исправлена с помощью doBy
library(doBy)
bylength = function(x){length(x)}
newdt = bylength(X ~From.EMail + To.EMail, data = dt, FUN = bylength)
Ответ 7
Я также сталкиваюсь с той же проблемой, я разрешаю ее, только сохраняя необходимые данные для ddply и конвертируя переменную фильтра и все необходимые текстовые переменные в символ, используя as.character
он работал