切片操作避免循环
Avoid Loop in Slicing Operation
我有以下使用 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 的总和添加到该列表。
可以使用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
如果您必须像原始数据一样对数据执行它 post
setDT(mydata)
mydata[, id:=rep(1:length(breaks), breaks),][, sum(Freq), by=id]
我有以下使用 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 的总和添加到该列表。
可以使用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
如果您必须像原始数据一样对数据执行它 post
setDT(mydata)
mydata[, id:=rep(1:length(breaks), breaks),][, sum(Freq), by=id]