-1

大きなデータフレーム (100 万行以上) で、特定の範囲内にあり、3 番目の基準を満たす要素 (行) の数を数えています。私はこれらの範囲を 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 ループのより効率的な実装です。ベクトル化を使用して目的を達成するための 1 つのアプローチを次に示します。

# 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これは完全にベクトル化されているため、を使用するよりも効率的です。

于 2013-03-05T16:01:09.183 に答える