2011-05-02 74 views
111

假設只選擇數值列,你有這樣的data.frame:從數據幀

x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20]) 

你會如何選擇僅在X是數字的那些列?

回答

181

由於數據幀是一個列表,我們可以使用該列表,應用功能:

nums <- sapply(x, is.numeric) 

從基部包然後標準子集

x[ , nums] 
+6

謝謝,我發現有一個剛因爲你發佈它x [,sapply(x,is.numeric)] – 2011-05-02 22:31:12

+5

'x [nums]'或'x [sapply(x,is.numeric)]'也適用。他們總是返回'data.frame'。比較'x [1]'和'x [,1]' - 第一個是data.frame,第二個是矢量。如果想阻止轉換,那麼必須使用'x [,1,drop = FALSE]'。 – Marek 2011-05-03 11:46:47

+0

「!is.numeric」是否工作? – PatrickT 2013-11-29 10:17:32

8

Filter()是針對使用 - 功能完善案例: 您只需代碼:

Filter(is.numeric, x) 

它也比select_if()快得多:

library(microbenchmark) 
microbenchmark(
    dplyr::select_if(mtcars, is.numeric), 
    Filter(is.numeric, mtcars) 
) 

回報(我的電腦上)的60微秒Filter中位數,而21 000微秒dplyr(350X更快)。

+0

當沒有數字列時,此解決方案不會失敗。使用它有什麼缺點嗎? – bli 2016-11-22 10:10:29

+0

過濾器僅適用於數據幀的行而不適用於列。因此,這種解決方案不會給出正確的結果。 – Michael 2017-01-18 11:45:48

+0

@Michael不要混淆從基礎包過濾和從dplyr包過濾! – 2017-02-01 14:45:08

0

這個交替代碼給其他答案:

x[, sapply(x, class) == "numeric"] 

data.table

x[, lapply(x, is.numeric) == TRUE, with = FALSE] 
+0

'training'從哪裏來?不應該讀'x'嗎? – Uwe 2016-11-13 16:16:41

+0

確定複製並粘貼並且不檢查問題 – 2016-11-13 16:22:54

+3

這是對選定答案的更多評論,而不是唯一答案。 – 2016-11-13 17:55:14

37

的dplyr包的select_if()函數是一個優雅的解決方案:

library("dplyr") 
select_if(x, is.numeric) 
+0

這是我的解決方案,但它看起來像'select_if()'現在已經摺舊了。 – ApeWithPants 2018-01-03 18:23:03

1

如果你有很多因素變量,你可以使用select_if功能。 安裝dplyr軟件包。有許多功能通過滿足條件來分隔數據。你可以設置條件。

像這樣使用。

categorical<-select_if(df,is.factor) 
str(categorical) 
+1

看起來像這個較早的答案的副本http://stackoverflow.com/a/40808873/170352 – 2017-01-06 04:07:09

1

PCAmixdata已functon一個給定的數據幀「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)