Передача определенного числа строк в функцию в R - PullRequest
1 голос
/ 07 октября 2019

Я хотел бы передать 1500 строк в функцию, пока не достигнет конца набора данных. В настоящее время я жестко запрограммировал количество строк. Мой код

AA1 = AA[1:1500,]
AA2 = AA[1501:3000,]
AA3 = AA[3001:4500,]
AA4 = AA[4501:6000,]
AA5 = AA[6001:6573,]
#passing into the function generate_pa
AAdone1 = generate_pa(AA1)
AAdone2 = generate_pa(AA2)
AAdone3 = generate_pa(AA3)
AAdone4 = generate_pa(AA4)
AAdone5 = generate_pa(AA5)

Могу ли я сделать это эффективно? Должен ли я создать цикл for?

Ответы [ 4 ]

1 голос
/ 07 октября 2019

Если nr - это количество строк во входном фрейме данных, а k - это количество строк в каждом чанке, то для встроенной anscombe data.frame для воспроизводимости будет использоваться любая из этих split строк. создать список кусков. Вы можете lapply свою функцию к этому. Пакеты не используются.

nr <- nrow(anscombe)
k <- 3 # 1500 in your case

split(anscombe, rep(1:nr, each = k, length = nr))

# or
split(anscombe, droplevels(gl(nr, k, nr)))
1 голос
/ 07 октября 2019

Вот примерно такой же подход к Вимпелю:

sequence <- 1:6573

lists <- split(sequence, ceiling(seq_along(sequence)/1500))

lapply(lists, generate_pa)
1 голос
/ 07 октября 2019

В базе R мы также можем использовать by, который делает шаг split-apply-combine вместе. Поскольку у вас уже есть два метода для разделения данных на каждые n строки, я покажу другой способ, используя gl.

n <- 1500
by(AA, gl(ceiling(nrow(AA)/n), n)[1:nrow(AA)], generate_pa)

. Это разбивает данные на каждые 1500 строк и применяет функцию generate_pa ккаждый кусок

1 голос
/ 07 октября 2019

вы можете разбить таблицу данных на куски размером chuncksize, используя data.table::split

Затем вы можете передать полученный список l любой функции, используя lapply( l, ...)

что он на самом деле делает:
setDT(AA) преобразует AA в data.table
[, rowID := (.I-1) %/% chunksize] создает новый столбец, основанный на целочисленном делении по числу, используется .I, потому что data.table не имеет имен строк.
Затем результат разделяется на вновь созданный столбец rowID.

#sample data
set.seed(123)
AA <- data.frame( data = rnorm(10))

#     data
# 1  -0.56047565
# 2  -0.23017749
# 3   1.55870831
# 4   0.07050839
# 5   0.12928774
# 6   1.71506499
# 7   0.46091621
# 8  -1.26506123
# 9  -0.68685285
# 10 -0.44566197

chunksize = 3
l <- split( setDT(AA)[, rowID := (.I-1) %/% chunksize][], by = "rowID")

# $`0`
#          data rowID
# 1: -0.5604756     0
# 2: -0.2301775     0
# 3:  1.5587083     0
# 
# $`1`
#          data rowID
# 1: 0.07050839     1
# 2: 0.12928774     1
# 3: 1.71506499     1
# 
# $`2`
#          data rowID
# 1:  0.4609162     2
# 2: -1.2650612     2
# 3: -0.6868529     2
# 
# $`3`
#         data rowID
# 1: -0.445662     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...