Скажем, у меня есть этот data.frameГруппа data.frame по нескольким столбцам
data <- data.frame(foo = c(1, 1, 2, 2),
bar = c(10,10,10,20),
baz = c(1, 2, 3, 4),
qux = c(5, 6, 7, 8))
Я хочу, чтобы сгруппировать его по foo
и bar
столбцов, чтобы прибыть на это:
expected <- list(
data.frame(foo = c(1, 1),
bar = c(10, 10),
baz = c(1, 2),
qux = c(5, 6)),
data.frame(foo = 2,
bar = 10,
baz = 3,
qux = 7),
data.frame(foo = 2,
bar = 20,
baz = 4,
qux = 8)
)
я могу генерировать кадр со строкой для каждой группы, но я не смог найти функцию MATCH
; что при заданном входном кадре со столбцами foo,bar,baz,qux
и в кадре фильтра с столбцами foo,bar
возвращаются строки, в которых соответствует содержимое ячейки foo,bar
.
groups <- unique(data[c("foo","bar")])
MATCH(data, groups[1,]) == expected[[1]]
MATCH(data, groups[2,]) == expected[[2]]
MATCH(data, groups[3,]) == expected[[3]]
Или более высокий уровень GROUP
функция, которая просто возвращает список фреймов, где столбцы данный матч:
GROUP(data, by=c("foo","bar")) == expected
Ближайший я пришел к тому, что это
out <- aggregate(. ~ foo + bar, data, list)
Где ячейки baz
, qux
являются следующими:
> out
foo bar baz qux
1 1 10 1, 2 5, 6
2 2 10 3 7
3 2 20 4 8
> class(out[,"baz"])
[1] "list"
Таким образом, каждая группа представляет собой строку в out
, но как я могу развернуть это снова, так что out[1,]
станет data.frame с двумя строками, например expected[[1]]
?
другой вариант по той же схеме является ' split (данные, вставка (данные $ foo, данные $ bar)) ' – eddi
@eddi, конечно. Я просто использую 'split' так, как он разработан/документирован, предоставляя« список »факторов группировки при расщеплении более чем на один фактор. Решение 'paste' устраняет необходимость использования' drop'. Вы видите какие-либо преимущества 'paste' над' взаимодействием' (что по умолчанию используется 'split')? Кажется, я помню, как я видел ответ на SO, где 'paste' был значительно быстрее, чем« взаимодействие », но не может найти его прямо сейчас. – A5C1D2H2I1M1N2O1R2T1
afaik 'interactive' просто добавляет много лишних вещей (а потом и в конце концов« вставляет »), которые просто не нужны для этого конкретного случая. – eddi