2015-08-20 4 views
3

У меня есть следующий код, который я выполняю, используя цикл for. Есть ли способ сделать то же самое без цикла for?Избегайте цикла в операции нарезки

first_list <- c(1,2,3, rep(1,5), rep(2,5), rep(3,5), rep(4,5)) 
print(first_list) 
[1] 1 2 3 1 1 1 1 1 2 2 2 2 2 
[1] 3 3 3 3 3 4 4 4 4 4 

breaks <- c(rep(1,3), rep(5,4)) 
values <- vector() 
i <- 1 
prev <- 1 

for (n in breaks){ 
    values[i] <- sum(first_list[prev:sum(breaks[1:i])]) 
    i <- i + 1 
    prev <- prev + n 
} 

print(values) 
[1] 1 2 3 5 10 15 20 

Цель петли взять первые три элемента списка, а затем добавить к этому списку суммы из следующих четырех наборов из 5

+0

Это просто ... некоторые данные. Лол. Я отредактирую свой вопрос и просто слейте образец в конце в исходный код. – wesanyer

+0

У вас есть код? Это привело к «1 2 3 25 25 NA NA» – Khashaa

+0

Хм, мой код работает, но я не вводил его правильно. Я исправлю это здесь. – wesanyer

ответ

5

Вы можете использовать tapply для сгруппированной работы

tapply(first_list, rep(1:length(breaks), breaks), sum) 

или, предпочтительно, с помощью data.table

library(data.table) 
data.table(first_list, id=rep(1:length(breaks), breaks))[, sum(first_list), id]$V1 

Если вам необходимо выполнить его на своих данных, как в вашем исходном сообщении

setDT(mydata) 
mydata[, id:=rep(1:length(breaks), breaks),][, sum(Freq), by=id] 
Смежные вопросы