-1

在一个大型数据帧(超过 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],])
}
4

2 回答 2

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)
于 2013-03-05T14:35:05.067 回答
0

apply函数不是矢量化的。它们只是 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))

这应该比 using 更有效mapply,因为它是完全矢量化的。

于 2013-03-05T16:01:09.183 回答