特定の列に対して10k個の行を含むデータフレームがあります。重複する値があります。この列にこの値が含まれている行をランダムに1つだけ選択するにはどうしたらいいですか?データフレームで一意に選択します。
5
A
答えて
6
あなたの質問は完全ではありませんが、 "重複するクラス"ごとに1つの(ランダムに選択された)行を保持して、データフレーム全体をサブサンプルすると仮定しています。
library(plyr)
subsampled_data <- ddply(mydata,.(X),
function(x) {
x[sample(nrow(x),size=1),]
})
のような何かが(がテストされていません!)動作するはず
6
私の最初の本能は、ベンのエレガントなddply
ソリューションのようなものだったでしょう。しかし、今大規模なデータセットがあることを知って、間違いなく速い方法があります。ここでは、多くのユニークな値を持っている場合はより速く、多くの倍となるものです。
RemoveDups <- function(df, column) {
inds = sample(1:nrow(df))
df = df[inds, ]
dups = duplicated(df[, column])
df = df[!dups, ]
inds = inds[!dups]
df[sort(inds, index=T)$ix, ]
}
は(ここでは多くのユニークな値を持つ)いくつかのデータをシミュレート:
> system.time(ddply(data, 'X1', function(x) x[sample(nrow(x), size=1), ]))
user system elapsed
3.264 0.921 4.315
> system.time(RemoveDups(data, 'X1'))
user system elapsed
0.375 0.025 0.399
:
n.row = 10^6
n.col = 3
set.seed(12345)
data = data.frame(matrix(sample(1000, n.row*n.col, replace=T), nrow=n.row))
は、2つの方法を比較
+0
エレガント!恐ろしい、ありがとうジョン – Rad
関連する問題
- 1. 選択した列のみを持つデータフレームで一意です
- 2. データフレームの単一列から一意の値を選択する
- 3. 一意の値のセットから一意のランダムなサブセットを選択します。
- 4. MySQLは値に一致する一意のレコードを選択します
- 5. 一連のバックアップで一意の.mp3ファイルを選択します。 Mac、Unix
- 6. Mysqlが一意の値を選択しています
- 7. MySQLはリレーションシップテーブルから一意の値を選択します
- 8. データベースから一意の値を選択
- 9. MySQLから一意の行を選択
- 10. Jqueryで一意の列からチェックボックスを選択/選択解除する
- 11. PL/SQLカーソル一意のレコードを選択し、フラットファイルで印刷
- 12. 配列からランダムな要素を選択しますが、一意です
- 13. リスト選択オプションをマット選択リストで一意にするにはどうすればいいですか?
- 14. SQL:特定の列に一意である選択行は
- 15. 指定された列に従って一意の行を選択します。
- 16. 一意性のより良い選択肢に対抗しますか?
- 17. SAPで一意のレコードを選択する方法
- 18. SQLで一意のサブシーケンスを選択する方法は?
- 19. CoreDataでNSManagedObjectの一意のラベルを選択する
- 20. 特定の期間に一意のログインを選択する
- 21. 選択したポイントをパンダのデータフレームに保存します
- 22. データフレームを選択してグローバル環境のリストにインポートします
- 23. Mathematicaで「任意」を選択
- 24. 一意の乱数を使用したクエリの選択
- 25. 選択のみテーブル行の選択ドロップダウンの一意の組み合わせ
- 26. SQL - 一意な答えのみを返すクエリを選択します。
- 27. mySQL - 2つの列で一意の値を選択
- 28. フィールドが一意である場合にcount()を選択してください
- 29. データフレームをその名前で選択/選択/アクセスR
- 30. C#LINQ一意のプロパティを持つアイテムのみを選択します。
OPの(潜在的な)質問のこの解釈は、私が 'df [sample(which df $ X == myVal)、1)]'を提案しようとしていました。 – joran
あなたのスニペットで提案されているmyValがX列に沿って変化するため、これをすべての列の値に適用したい場合は、ベンの提案、Joranのやり方を試しています。 8Sなどなど – Rad
@Rad Benの解決策がそれを処理します。私はしません。私たちはあなたの質問を違った方法で解釈しました。 – joran