Ответ 1
Рассмотрим использование ddply в пакете plyr вместо. Он обрабатывает работу по добавлению столбца в ваш файл данных.
Я использую функцию "by" в R, чтобы разорвать фрейм данных и применить функцию к различным частям, например:
pairwise.compare <- function(x) {
Nright <- ...
Nwrong <- ...
Ntied <- ...
return(c(Nright=Nright, Nwrong=Nwrong, Ntied=Ntied))
}
Z.by <- by(rankings, INDICES=list(rankings$Rater, rankings$Class), FUN=pairwise.compare)
Результат (Z.by) выглядит примерно так:
: 4
: 357
Nright Nwrong Ntied
3 0 0
------------------------------------------------------------
: 8
: 357
NULL
------------------------------------------------------------
: 10
: 470
Nright Nwrong Ntied
3 4 1
------------------------------------------------------------
: 11
: 470
Nright Nwrong Ntied
12 4 1
Я хочу, чтобы этот результат преобразовывался в фрейм данных (при этом элементы NULL не присутствуют), поэтому он выглядит так:
Rater Class Nright Nwrong Ntied
1 4 357 3 0 0
2 10 470 3 4 1
3 11 470 12 4 1
Как мне это сделать?
Рассмотрим использование ddply в пакете plyr вместо. Он обрабатывает работу по добавлению столбца в ваш файл данных.
Функция by
возвращает список, поэтому вы можете сделать что-то вроде этого:
data.frame(do.call("rbind", by(x, column, mean)))
Старый поток, но для тех, кто ищет эту тему:
analysis = by(...)
data.frame(t(vapply(analysis,unlist,unlist(analysis[[1]]))))
unlist()
примет элемент вывода by()
(в данном случае analysis
) и выражает его как именованный вектор.
vapply()
отключает список всех элементов analysis
и выводит результат. Для этого требуется фиктивный аргумент, чтобы узнать тип вывода, для которого существует analysis[[1]]
. Возможно, вам придется добавить проверку, что анализ не пуст, если это будет возможно.
Каждый вывод будет столбцом, поэтому t()
переносит его на желаемую ориентацию, где каждый элемент анализа становится строкой.
Это расширяет решение Shane с помощью rbind(), но также добавляет столбцы, идентифицирующие группы, и удаляет NULL-группы - две функции, которые были запрошены в вопросе. Используя базовые функции пакета, не требуется никаких других зависимостей, например, plyr.
simplify_by_output = function(by_output) {
null_ind = unlist(lapply(by_output, is.null)) # by() returns NULL for combinations of grouping variables for which there are no data. rbind() ignores those, so you have to keep track of them.
by_df = do.call(rbind, by_output) # Combine the results into a data frame.
return(cbind(expand.grid(dimnames(by_output))[!null_ind, ], by_df)) # Add columns identifying groups, discarding names of groups for which no data exist.
}
Я бы сделал
x = by(data, list(data$x, data$y), function(d) whatever(d))
array(x, dim(x), dimnames(x))