У меня есть таблица данных следующим образом:
## install.packages(c("gapminder", "data.table"))
library(gapminder)
library(data.table)
gapminder <- data.table(gapminder)
my_table <- gapminder[, .(mdl = .(lm(lifeExp ~ pop + gdpPercap,
data = gapminder))),
by = .(country, continent)]
Результирующая таблица будет,
country continent mdl
1: Afghanistan Asia <lm>
2: Albania Europe <lm>
3: Algeria Africa <lm>
4: Angola Africa <lm>
5: Argentina Americas <lm>
---
138: Vietnam Asia <lm>
139: West Bank and Gaza Asia <lm>
140: Yemen, Rep. Asia <lm>
141: Zambia Africa <lm>
142: Zimbabwe Africa <lm>
Теперь я хочу получить список из этой таблицы данных, так что mdl
должен лежать в каждом country
, который сам вложен в continent
.
Я попытался получить результат как,
first_list <- split(my_table, my_table$continent)
second_list <- lapply(first_list, function(x){
split(x[, country := as.character(country)], x$country)
})
final_list <- sapply(second_list, function(x) sapply(x, function(y) y$mdl))
Есть ли какой-нибудь элегантный способ сделать это?
?split.data.table
также посмотреть примеры там. Методsplit
data.table может создавать вложенные списки. Обязательно обновите, так какsplit.data.table
было введено в версии 1.9.8. Это нормально, чтобы самостоятельно ответить на вопрос SO. - person jangorecki   schedule 06.12.2016split(my_tab, by=c("continent", "country"), keep.by = FALSE, flatten = FALSE)
, гдеmy_tab
- это таблица, измененная так, чтобы иметь столбцы char вместо факторов (поскольку последний выдает ошибку, по-видимому, связанную с ограничениями столбцовdogroups
) . - person Frank   schedule 06.12.2016