Как запустить функцию для "кусков" строк - PullRequest
0 голосов
/ 05 мая 2020

У меня есть функция textPrep. Это берет столбец текста и подразделяет его в соответствии с заголовками в тексте, а также множеством других вещей. Функция не может действительно обрабатывать более 2000 строк, прежде чем она замедлится и тихо завершит работу.

В настоящий момент у меня нет времени переделывать функцию, но она мне нужна. Итак, у меня 50000 строк, и мне нужно сделать что-то вроде:

output1<-EndoMineR::textPrep(MyText[1:1000,]$new,mydelimEndo)
output2<-EndoMineR::textPrep(MyText[1001:2000,]$new,mydelimEndo)
output3<-EndoMineR::textPrep(MyText[2001:3000,]$new,mydelimEndo)
output4<-EndoMineR::textPrep(MyText[3001:4000,]$new,mydelimEndo)

#etc.    

output1_2<-rbind(output1,output2)
output3_4<-rbind(output3,output4)
oot<-rbind(output1_2,output3_4)

#etc.

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

1 Ответ

1 голос
/ 05 мая 2020

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

# generate data
n = 1e5 + 300
n
df <- data.frame(a = rnorm(n), b = rnorm(n))

# define groups for function
breaks <- seq(0, nrow(df), by = 1000)
if(tail(breaks,1) < nrow(df)) breaks <- c(breaks,Inf)
group <- cut(x = seq(nrow(df)), breaks, include.lowest = TRUE)

# set up list for results of each group
res <- vector("list", length = length(levels(group)))

# fill in list by call to function on each group
for(i in seq(res)){
  mat <- which(match(as.character(group), levels(group)[i])==1)
  res[[i]] <- apply(df[mat,], 2, FUN = sum)
}

# results
res

# collapse if desired
res2 <- do.call("rbind", res)
res2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...