在切片操作中避免循环

wes*_*yer 3 for-loop r conventions

我有以下代码,我使用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
Run Code Online (Sandbox Code Playgroud)

循环的目的是获取列表的前三个元素,然后将接下来的四个5的总和添加到该列表中.

Kha*_*haa 5

您可以使用tapply分组操作

tapply(first_list, rep(1:length(breaks), breaks), sum)
Run Code Online (Sandbox Code Playgroud)

或者,最好是使用 data.table

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

如果您必须像在原始帖子中那样对数据执行此操作

setDT(mydata)
mydata[, id:=rep(1:length(breaks), breaks),][, sum(Freq), by=id]
Run Code Online (Sandbox Code Playgroud)