Обновление
Мой оригинальный пост начинался с этого ошибочного утверждения:
Проблема с индексацией через rownames
и colnames
заключается в том, что вы выполняете векторное / линейное сканированиедля каждого элемента, например.Вы просматриваете каждую строку, чтобы увидеть, что называется «36», а затем начинаете с начала, чтобы сделать это снова для «34».
В комментариях Саймон указал, что R, очевидно, используетхеш-таблица для индексации.Извините за ошибку.
Оригинальный ответ
Обратите внимание, что предложения в этом ответе предполагают, что у вас есть непересекающиеся подмножества данных.
ЕслиВы хотите сохранить свою стратегию поиска в списке, я бы рекомендовал хранить фактические индексы строк вместо имен строк.
Альтернативой является сохранение информации о вашей "группе" в качестве другого столбца для вашего data.frame
,затем split
ваш data.frame
в своей группе, например.скажем, ваш перекодированный data.frame
выглядит следующим образом:
dat <- data.frame(a=sample(100, 10),
b=rnorm(10),
group=sample(c('a', 'b', 'c'), 10, replace=TRUE))
Затем вы можете сделать:
split(dat, dat$group)
$a
a b group
2 66 -0.08721261 a
9 62 -1.34114792 a
$b
a b group
1 32 0.9719442 b
5 79 -1.0204179 b
6 83 -1.7645829 b
7 73 0.4261097 b
10 44 -0.1160913 b
$c
a b group
3 77 0.2313654 c
4 74 -0.8637770 c
8 29 1.0046095 c
Или, в зависимости от того, что вы действительно хотите делать со своими "сплитами",Вы можете преобразовать data.frame
в data.table
и установить его ключ для вашего нового столбца group
:
library(data.table)
dat <- data.table(dat, key="group")
Теперь сделайте ваш список - что даст вамтот же результат, что и split
выше
x <- lapply(unique(dat$group), function(g) dat[J(g),])
Но вы, вероятно, хотите «работать над своими плевками», и вы можете сделать это встроенным, например:
ans <- dat[, {
## do some code over the data in each split
## and return a list of results, eg:
list(nrow=length(a), mean.a=mean(a), mean.b=mean(b))
}, by="group"]
ans
group nrow mean.a mean.b
[1,] a 2 64.0 -0.7141803
[2,] b 5 62.2 -0.3006076
[3,] c 3 60.0 0.1240660
Вы можетевыполните последний шаг "аналогичным образом" с plyr
, например:
library(plyr)
ddply(dat, "group", summarize, nrow=length(a), mean.a=mean(a),
mean.b=mean(b))
group nrow mean.a mean.b
1 a 2 64.0 -0.7141803
2 b 5 62.2 -0.3006076
3 c 3 60.0 0.1240660
Но поскольку вы упоминаете, что ваш набор данных довольно большой, я думаю, вам понравится скоростьУсиление data.table
обеспечит.