循环的子分组数据帧R避免

循环的子分组数据帧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)

在一个大的数据帧(100多万行)中,我正在计算特定范围内满足第三个条件的元素(行)的数量。我有33个范围,用一个非常慢的for循环来得到答案,没问题

由于速度是一个巨大的问题,我将感谢任何帮助,使这运行得更快。我可以摆脱for循环和“矢量化”或任何类型的“应用”解决方案吗

提前谢谢

代码:


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)
#第一个逻辑索引(向量)

idx1
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))

这应该比使用
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))