子集化数据帧R避免for循环

时间:2013-03-05 14:21:51

标签: r for-loop dataframe vectorization subset

在大型数据框(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],])
}

2 个答案:

答案 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更有效,因为它是完全矢量化的。