この質問は、@alexis_laz によって非常にきちんとした方法で回答されたこの質問のフォローアップとして尋ねています。残念ながら、彼の方法 (ゼロの負荷で長いデータフレームを作成することを含む) は、元のデータセットが劇的に拡大した現在、データ量が多すぎます。
基本的な問題はこれです。x、y、z の 3 つの列を持つデータフレームを考えてみましょう。すべての y の最小の x 値に関連付けられている z と x の値を探しています。理想的な出力はy[i]_x[i]_z[i]
、関連する行番号 i を持つタイプの文字列です。
ここに再現可能な例があります
set.seed(1)
x <- rpois(10000, lambda = 10); x[sample.int(50, 20)] <- NA
y <- rep(LETTERS, length.out=10000)
z <- seq(1:10000)
df <- data.frame(cbind(x,y,z))
望ましい出力(dfを注文してスクロールするだけで見つけました):
df <- df[order(y,x,z),]
- y = A、min(x) = 2、z = 313 の場合 => 目的の結果 (NA を削除できます) は
paste0(y,"_",x,"_",z)
、A_1_313のようになります。 - y = B の場合、min(x) = 2、z = 782、6008、または 7230 の場合 => 望ましい結果は 3 つの文字列すべて、つまり B_2_782、B_2_6008、および B_2_7230 になります。
- y = F、min(x) = 3 の場合、この最小値は 5 つの異なる z 値 (4114、4712、5336、7234、7520) にリンクされているため、5 つの文字列を取得したいと思います ....
実際のデータセットのどこかに出力として 5 つを超える文字列があるとは思いません。前述のように、@alexis_laz はほぼ同じ問題 (これも私から質問されました) に対する解決策を提供しましたが、その解決策には、私のデータセットが37から15000社:)
前もって感謝します!
max.col
PS:とwhich.max
組み合わせて使用するソリューションを探しましたtapply
が、これまでのところうまくいきませんでした。tapply(x,y,which.min)
which.min は、tapply 関数で常に 1 であるベクトル/行列内の位置を返すため、順序付けられた df で単に 1 のリストを返すようなものがあるようです。したがってtapply
、df の行番号を使用するが返すものは、ジョブの 99% になります。