データフレームがあり、値が0より大きい場合は最初の56個の列のすべてのデータポイントを2進化したいと思います1に設定します。それ以外の場合は0に設定されます。これを行う簡単な方法はありますか?ベクトル化ifelse
はあなたが行うことができます使用Rのデータフレーム内のデータを2進化する必要があります
答えて
:
m[,1:56] <- ifelse(m[,1:56] > 0,1,0)
たとえば、私たちは、小さな行列でこれをテストすることができます。
はm <- matrix(sample(c(-2,2),5*3,rep=T),ncol=5,nrow=3,byrow=T)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 2 2 2 2 -2
[2,] 2 2 -2 2 -2
[3,] 2 2 2 2 2
> m[,2:5] <- ifelse(m[,2:5] > 0,1,0)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 2 1 1 1 0
[2,] 2 1 0 1 0
[3,] 2 1 1 1 1
私の考えはまさに! (私は別の代替案を投稿しなければならなかったので) – A5C1D2H2I1M1N2O1R2T1
@AnandaMahto、amazing !! –
@RicardoSaporta、バイナリの結果が必要なだけでなく、実際には 'ifelse'が好きです。 – A5C1D2H2I1M1N2O1R2T1
あなたがTRUE
とFALSE
がに等しいという事実を利用することができます"1"と "0"を入力してください。
set.seed(1)
mydf <- data.frame(matrix(rnorm(100), nrow = 10))
mydf[, 1:5] <- (mydf[, 1:5] > 0) + 0
mydf
# X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# 1 0 1 1 1 0 0.3981059 2.40161776 0.475509529 -0.5686687 -0.5425200
# 2 1 1 1 0 0 -0.6120264 -0.03924000 -0.709946431 -0.1351786 1.2078678
# 3 0 0 1 1 1 0.3411197 0.68973936 0.610726353 1.1780870 1.1604026
# 4 1 0 0 0 1 -1.1293631 0.02800216 -0.934097632 -1.5235668 0.7002136
# 5 1 1 1 0 0 1.4330237 -0.74327321 -1.253633400 0.5939462 1.5868335
# 6 0 0 0 0 0 1.9803999 0.18879230 0.291446236 0.3329504 0.5584864
# 7 1 0 0 0 1 -0.3672215 -1.80495863 -0.443291873 1.0630998 -1.2765922
# 8 1 1 0 0 1 -1.0441346 1.46555486 0.001105352 -0.3041839 -0.5732654
# 9 1 1 0 1 0 0.5697196 0.15325334 0.074341324 0.3700188 -1.2246126
# 10 0 1 1 1 1 -0.1350546 2.17261167 -0.589520946 0.2670988 -0.4734006
+0
の考え方は、単に論理値TRUE
とFALSE
を数値に等しくすることです。 すべての行列で作業していて、as.numeric(mydf > 0)
を使用している場合、結果のベクトルを行列に再変換する必要があります。しかし、この場合、これは完全にうまくいく(@Dasonによって指摘されているように)。
mydf[, 1:5] <- as.numeric(mydf[, 1:5] > 0)
ここで 'as.numeric'を使ってみましたか?それは私のための交換でうまく動作します...私たちが交換をしていない場合、違いは重要ですが、このようなもののためにはうまく動作します。 – Dason
@Dason、Good catch! (いいえ、私は試していない - ちょうど私は同じ長さではない行についてのエラーを得たと仮定した)。良い古いリサイクル、私は推測するだろう。私は更新します。ありがとう。 – A5C1D2H2I1M1N2O1R2T1
pmin
およびpmax
を使用するアプローチ。 (実際にはお勧めしません)
pmin(pmax(m[,2:5], 0),1)
しかし、それはAnandaMahtoのソリューション@いくつかのベンチマークに
ag <- function() ifelse(m[,2:5] > 0,1,0)
mn <- function()pmin(pmax(m[,2:5], 0),1)
am <- function() (m[, 2:5] > 0) + 0
am2 <- function() as.numeric((m[, 2:5] > 0))
library(microbenchmark)
microbenchmark(ag(),mn(), am(), am2())
## Unit: microseconds
## expr min lq median uq max neval
## ag() 19.888 20.712 21.9375 22.6430 39.548 100
## mn() 50.135 51.172 52.2530 53.1055 113.854 100
## am() 3.076 3.406 4.1755 4.6030 7.912 100
## am2() 2.623 2.989 3.4640 4.0135 6.995 100
を追加することができ、さらに高速as.numeric
アプローチで、明確な勝者です!
最近更新された答えに 'as.numeric'オプションを追加してください(私の宿題をやってくれたDasonに感謝します)。以前の経験によれば、それはさらに速くなるはずです。 – A5C1D2H2I1M1N2O1R2T1
@AnandaMahto - done。はい。 – mnel
- 1. R、ggvisは両方とも2つのデータフレームからグループ化する必要があります。
- 2. データフレームをサブセット化すると、より多くのデータを取得する必要があります。
- 3. R内の2つのデータフレームにまたがるデータの一致
- 4. FirebaseDabaseからデータをフラグメント化する必要があります
- 5. 予測データを視覚化する必要があります
- 6. 10進数の形式にする必要があります。
- 7. 2つのデータフレーム内のデータを結合するR
- 8. Rでマージする前にデータをソートする必要がありますか?
- 9. データフレーム内のシーケンスでグループ化するR
- 10. コンストラクタ内のすべてを初期化する必要がありますか?
- 11. CloudSQLデータベースのデータを暗号化する必要がありますか?
- 12. Rが、私はこのようになります私のデータフレームにいくつかのデータを交換する必要があるデータフレーム
- 13. データ型のシリアル化を行う必要があり、データ型をシリアル化する方法がある場合
- 14. MySQLのクエリを助ける必要があります。 2つのテーブルのデータが必要
- 15. Matlabデータのインポート:10進数がより多く必要です
- 16. Symfony 1.3:バックエンドフィルタフィールドのデータをオーバーライドする必要があります
- 17. Endeca CASのデータを修正する必要があります
- 18. ダイナミックテーブルの2行をマージする必要があります
- 19. react-redux:店舗データを冗長化する必要がありますか?
- 20. キーチェーン内のデータを手動で暗号化する必要がありますか?
- 21. なぜオブジェクト配列を2回インスタンス化する必要がありますか?
- 22. データフレーム内の重複データを排除するfor-loopをベクトル化するR
- 23. ビットマスクをより多くの可能性に進化させる必要があります
- 24. テキストボックスはHexa 10進値のみを許可する必要があります
- 25. モデル内のパラメータを更新する必要があります
- 26. 角度2はオブジェクトまたはデータをサービスまたはコンポーネント内に格納する必要があります
- 27. Rデータフレーム内の単一要素にアクセスすると、Listを返すことがありますか?
- 28. このデータをさらに正規化する必要はありますか?
- 29. node.js:暗号化する必要があるデータを暗号化しますか?
- 30. データのペアリングを助ける必要があります
[この質問](http://stackoverflow.com/q/14526429/1270695)とさまざまな回答と、速度が懸念される場合のベンチマークも参照できます。この質問との違いは、列のサブセットのみで作業していることです。 – A5C1D2H2I1M1N2O1R2T1
TRUE/FALSEではなく0/1の値が必要な特別な理由はありますか?あなたは、結果をかなりの数の論理的なものとして残してしまうことができます。 – Dason