2012-08-15 3 views
3

У меня есть кадр данных с 1000 строк, и я хочу выполнить некоторую операцию на нем со 100 строками за раз. Итак, я пытаюсь выяснить, как использовать счетчик приращения числа строк и выбрать 100 строк за один раз, например от 1 до 100, затем от 101 до 200 ... uptil 1000 и выполнить операцию на каждом подмножестве, используя для цикла. Кто-нибудь может предложить, как это можно сделать, поскольку я не мог найти хороший метод.Выбор диапазона строк из кадра данных R

ответ

0

Ответ от @mrdwab велик, и показывает, как избежать цикл. Но если вы действительно должны использовать для цикла (пакет biglm бы один пример, где вы могли бы хотеть), то здесь один подход:

for(i in seq(1,1000,by=100)) { 
    myfun(df[ i:(i+99), ]) 
} 

Если общее количество строк не является кратным размеру блока то вам может понадобиться нечто большее:

tmp <- seq(1, nrow(df), by=100) 
tmp2 <- c(tail(tmp, -1)-1, nrow(df)) 
n <- length(tmp) 
out <- numeric(n) 
for(i in seq_along(tmp)) { 
    out[i] <- myfun(df[ tmp[i]:tmp2[i], ]) 
} 
7

Простым способом было бы создать переменную группировки, а затем использовать split() и lapply() для выполнения любых операций, в которых вы нуждаетесь.

Ваша группировка может быть легко создана с использованием rep().

Вот пример:

set.seed(1) 
demo = data.frame(A = sample(300, 50, replace=TRUE), 
        B = rnorm(50)) 
demo$groups = rep(1:5, each=10) 
demo.split = split(demo, demo$groups) 
lapply(demo.split, colMeans) 
# $`1` 
#   A   B  groups 
# 165.9000000 -0.1530186 1.0000000 
# 
# $`2` 
#   A   B  groups 
# 168.2000000 0.1141589 2.0000000 
# 
# $`3` 
#   A   B  groups 
# 126.0000000 0.1625241 3.0000000 
# 
# $`4` 
#   A   B  groups 
# 159.4000000 0.3340555 4.0000000 
# 
# $`5` 
#   A   B  groups 
# 181.8000000 0.0363812 5.0000000 

Если вы предпочитаете не добавлять группы к источнику data.frame, вы можете достичь того же эффекта, выполнив следующие действия:

groups = rep(1:5, each=10) 
lapply(split(demo, groups), colMeans) 

Конечно, замените colMeans любой функцией, которую вы хотите.

Использование пример через data.frame с 1000 строк, ваше rep() заявление должно быть что-то вроде:

rep(1:10, each=100) 
Смежные вопросы