2012-01-30 33 views
3

我在SO閱讀this question,想知道是否有任何方法以矢量化的方式使用is.numeric。重點是,如果你有一個矢量化的方式來檢查一個變量是否是數字,那麼任何依賴於變量的函數都可以被矢量化。否則,它不能被矢量化。是否有矢量化的方式來使用is.numeric?

+0

'is.numeric'是矢量化的......你能舉一個你正在想什麼的例子嗎? – 2012-01-30 14:44:14

+3

我假設提問者認爲'is.numeric(1:5)'應該給一個TRUE 5長的向量而不是一個TRUE。所以像'sapply(1:5,is.numeric)' – Justin 2012-01-30 14:51:16

+1

@Justin:啊,那麼答案是「否」。您不能在原子向量中混合類型,因此爲向量中的每個元素返回「TRUE」或「FALSE」值都是多餘的。你可以在列表中混合類型(這是data.frame是什麼),這就是你應該使用'sapply'解決方案的地方。 – 2012-01-30 14:58:20

回答

7

按照評論:

如果你正在尋找測試與as.numeric一個data.frame列,使用apply

> dat <- data.frame(v1=1:5,v2=letters[1:5],v3=rnorm(5),v4=c(1,2,'c','d',5)) 

> sapply(dat,is.numeric) 
    v1 v2 v3 v4 
TRUE FALSE TRUE FALSE 

或者,多種,你可以使用colwise從所述plyr包:

> colwise(is.numeric)(dat) 
    v1 v2 v3 v4 
1 TRUE FALSE TRUE FALSE 
+1

'plyr'軟件包有一個'numcolwise'函數,可以自動將任何函數應用於數據框中的數字列。 – Ramnath 2012-01-30 19:43:41

0

這應該得到所需的結果:

rep(is.numeric(x), length(x)) 
+1

然而,給定一個混合列表:'x <-list('a',2,'c',4)'這將產生一個所有'FALSE'的向量,因爲'is.numeric(x)'是'FALSE' 。 'lapply(x,is.numeric)'給出了預期的結果。 – Justin 2012-01-30 15:50:20

+0

@Justin:我期待輸入是一個單一的「變量」,我把它當作一個原子向量。對於問題措辭的不同解釋,你的方法可能(1)適用。 – 2012-01-30 15:53:04

相關問題