在大型数据框(100万+行)中,我计算特定范围内的元素(行)数量并满足第三个条件。我有33个这样的范围,并使用一个非常慢的for循环来得到答案,没问题。
由于速度是一个巨大的问题,我将不胜感激任何帮助,以使其更快地运行。我可以摆脱for循环和“矢量化”或任何类型的“应用”解决方案吗?
提前致谢
代码:
N.data<-c(1:33)
Lower<-c(0,100000,125000,150000,175000,200000,225000,250000,275000,300000,325000,350000,375000,400000,425000,450000,475000,500000,550000,600000,650000,700000,750000,800000,850000,900000,950000,1000000,1100000,1200000,1300000,1400000,1500000)
Upper<-c(100000,125000,150000,175000,200000,225000,250000,275000,300000,325000,350000,375000,400000,425000,450000,475000,500000,550000,600000,650000,700000,750000,800000,850000,900000,950000,1000000,1100000,1200000,1300000,1400000,1500000, 5000000)
for (i in 1:(length(N.data))){
N.data[i]<-nrow(dataset[dataset$Z==c & dataset$X > Lower[i] & dataset$X < Upper[i],])
}
答案 0 :(得分:1)
更有效的方法:
# first logical index (vector)
idx1 <- dataset$Z == c
# second logical index (matrix)
idx2 <- mapply(function(l, u) dataset$X > l & dataset$X < u, Lower, Upper)
# combine both indices and count number of rows
N.data <- colSums(idx1 & idx2)
答案 1 :(得分:0)
apply
函数未被VECTORIZED。它们仅仅是for循环的更有效的实现。为了实现使用矢量化所寻求的目标,这里有一种方法。
# Create a Dummy Dataset and Breaks
dataset = data.frame(
X = rpois(100, 10),
Z = rpois(100, 20)
)
breaks = seq(0, max(dataset$Z), length = 5)
# Add Column with Breaks
dataset = transform(dataset, Z2 = cut(Z, breaks, labels = FALSE))
# Use Aggregate to compute length for each value of Z2
c = 10
aggregate(Z ~ Z2, data = dataset, length, subset = (X == c))
这应该比使用mapply
更有效,因为它是完全矢量化的。