Подтвердить что ты не робот

Преобразовать объект "by" в кадр данных в R

Я использую функцию "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

Как мне это сделать?

4b9b3361

Ответ 1

Рассмотрим использование ddply в пакете plyr вместо. Он обрабатывает работу по добавлению столбца в ваш файл данных.

Ответ 2

Функция by возвращает список, поэтому вы можете сделать что-то вроде этого:

data.frame(do.call("rbind", by(x, column, mean)))

Ответ 3

Старый поток, но для тех, кто ищет эту тему:

analysis = by(...)
data.frame(t(vapply(analysis,unlist,unlist(analysis[[1]]))))

unlist() примет элемент вывода by() (в данном случае analysis) и выражает его как именованный вектор. vapply() отключает список всех элементов analysis и выводит результат. Для этого требуется фиктивный аргумент, чтобы узнать тип вывода, для которого существует analysis[[1]]. Возможно, вам придется добавить проверку, что анализ не пуст, если это будет возможно. Каждый вывод будет столбцом, поэтому t() переносит его на желаемую ориентацию, где каждый элемент анализа становится строкой.

Ответ 4

Это расширяет решение 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.
}

Ответ 5

Я бы сделал

x = by(data, list(data$x, data$y), function(d) whatever(d))
array(x, dim(x), dimnames(x))