次のようなdata.frameがあるとします。
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
xで数値である列のみをどのように選択しますか?
次のようなdata.frameがあるとします。
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
xで数値である列のみをどのように選択しますか?
回答:
編集:不適切なアドバイスの使用を避けるために更新されましたsapply
。
データフレームはリストなので、list-apply関数を使用できます。
nums <- unlist(lapply(x, is.numeric))
次に標準サブセット
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
より慣用的な現代のRについては、今お勧めします
x[ , purrr::map_lgl(x, is.numeric)]
よりコードが少なく、Rの特定の癖をあまり反映せず、より単純で堅牢で、データベースバックエンドのチブルで使用できます。
dplyr::select_if(x, is.numeric)
undefined columns selected
ます。どうやってそれを避けますか?
tryCatch()
を使用してこれに対処できます。新しい質問を開くことを検討してください。
Filter()
ベースパッケージからはそのユースケースに最適な関数です:あなたは単にコーディングする必要があります:
Filter(is.numeric, x)
また、以下よりもはるかに高速ですselect_if()
。
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
(私のコンピューターでは)の中央値は60マイクロ秒Filter
、21 000マイクロ秒select_if
(350倍高速)です。
Filter()
機能しないのは、たとえば機能しないなどの置き換えFilter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
です。
列名だけに興味がある場合は、これを使用してください:
names(dplyr::select_if(train,is.numeric))
これは他の答えの代替コードです:
x[, sapply(x, class) == "numeric"]
とともに data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
ライブラリPCAmixdataには、以下に示すように、特定のデータフレーム「YourDataframe」の量的(数値データ)と質的(カテゴリーデータ)を分割する機能splitmixがあります。
install.packages("PCAmixdata")
library(PCAmixdata)
split <- splitmix(YourDataframe)
X1 <- split$X.quanti(Gives numerical columns in the dataset)
X2 <- split$X.quali (Gives categorical columns in the dataset)
別の方法は次のようになります:-
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
多くの因子変数がある場合は、select_if
関数を使用できます。dplyrパッケージをインストールします。条件を満たすことでデータを分離する機能はたくさんあります。条件を設定できます。
このように使います。
categorical<-select_if(df,is.factor)
str(categorical)
x[nums]
またはx[sapply(x,is.numeric)]
同様に動作します。そして、彼らはいつも戻りdata.frame
ます。比較x[1]
vs-x[,1]
最初はdata.frame
、2番目はベクトルです。変換を防止したい場合は、を使用する必要がありますx[, 1, drop=FALSE]
。