2016-09-13 1 views
-2

Иногда я просто хочу подавать индексы или метки в функцию типа карты *, особенно в тех проблемах, где самым простым решением является перечислить все возможные комбинации. Итак, я пишу выражение как этотЭлегантные строки матрицы в список?

x = expand.grid(paste0("A", 1:10), paste0("B", 1:10))

Var1 Var2 
1 A1 B1 
2 A2 B1 
3 A3 B1 
4 A4 B1 
5 A5 B1 
6 A6 B1 

Теперь, теперь я хочу, чтобы преобразовать каждую строку в список с некрасивым хака как

data.frame(t(x))

Или что-то вроде это, что раздражает, поскольку вывод является вложенным списком и требует другого исправления lapply.

apply(x, 1, list) затем lapply(.Last.value, unlist)

Там должно быть более элегантный способ сделать это правильно?

+0

Является 'Раскол (х, строка (х))' близко к тому, что вы хотите? – aichao

ответ

1

Если x является матрицей под названием на вопрос, я не думаю, что это плохая идея, делая data.frame(t(x)). С другой стороны, если это кадр данных, сгенерированный expand.grid, вы можете использовать функцию transpose из пакета data.table, это превосходит t(x), потому что t() принуждает кадр данных к матрице, которая изменяет базовый режим хранения данных и изменений его обратно в кадр данных, который может быть очень неэффективно, в то время как transpose предназначен для списков, фреймов данных или таблиц данных инкорпорирующих, как из ?transpose:

транспонирования эффективный способ перенести списки, кадры данных или таблицы данных.

Вот некоторые тесты о транспозиции фрейм данных:

microbenchmark::microbenchmark(data.frame(t(x)), data.table::transpose(x), split(x, 1:nrow(x)), lapply(apply(x, 1, list), unlist), times = 10) 

# Unit: milliseconds 
#        expr  min   lq  mean  median   uq  max neval 
#     data.frame(t(x)) 114.061549 117.662053 121.628102 120.812289 125.132211 135.421358 10 
#   data.table::transpose(x) 1.146525 1.400207 1.469908 1.467571 1.623157 1.736432 10 
#    split(x, 1:nrow(x)) 160.550576 161.626339 187.385706 167.800102 179.647717 355.913319 10 
# lapply(apply(x, 1, list), unlist) 8.183313 8.379791 9.317694 8.783287 9.883049 12.345740 10 
Смежные вопросы