循环的子分组数据帧R避免
在一个大的数据帧(100多万行)中,我正在计算特定范围内满足第三个条件的元素(行)的数量。我有33个范围,用一个非常慢的for循环来得到答案,没问题 由于速度是一个巨大的问题,我将感谢任何帮助,使这运行得更快。我可以摆脱for循环和“矢量化”或任何类型的“应用”解决方案吗 提前谢谢 代码:循环的子分组数据帧R避免,r,for-loop,dataframe,vectorization,subset,R,For Loop,Dataframe,Vectorization,Subset,在一个大的数据帧(100多万行)中,我正在计算特定范围内满足第三个条件的元素(行)的数量。我有33个范围,用一个非常慢的for循环来得到答案,没问题 由于速度是一个巨大的问题,我将感谢任何帮助,使这运行得更快。我可以摆脱for循环和“矢量化”或任何类型的“应用”解决方案吗 提前谢谢 代码: N.data更有效的方法: # first logical index (vector) idx1 <- dataset$Z == c # second logical index (matrix)
N.data更有效的方法:
# 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)
#第一个逻辑索引(向量)
idx1apply
函数未矢量化。它们只是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
更有效,因为它是完全矢量化的。您是否可以发布至少一部分数据帧(有100多万行的数据帧?N.数据非常感谢您的回复。我可以肯定地看到,这是一个更有效的实施。虽然上面提到的建议给了我“空”范围的零值,但你的建议只是省略了。如何将最后一行代码更改为空范围返回0。提前感谢您无需回答,我自己用一个简单的ifelse语句找到了一个解决方案。
# 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))