2011-06-22 94 views
3

下面是我用它來找到一個數據幀數值變量的代碼:R:優雅的方式來確定數據幀數值變量

Data <- iris 
numericvars <- NULL 
for (Var in names(Data)) { 
    if(class(Data[,Var]) == 'integer' | class(Data[,Var]) == 'numeric') { 
     numericvars <- c(numericvars,Var) 
    } 
} 
numericvars 

有一個不太糊塗的方式做到這一點?

+1

種植物體是一個沒有沒有('numericvars < - C(numericvars,VAR)') –

回答

14

這是一個非常簡單的一行與sapply

sapply(Data, is.numeric) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
#   TRUE   TRUE   TRUE   TRUE  FALSE 

# is.numeric should pick up integer columns too 
Data$Species <- as.integer(Data$Species) 
sapply(Data, is.numeric) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
#   TRUE   TRUE   TRUE   TRUE   TRUE 
+1

物種在第二次嘗試出來TRUE。 –

+0

@Dirk:......根據'?is.numeric',應該如此。 –

+0

在這裏睡着了 - 我錯過了,你把這個因子轉換成了整數。 –

3

採用sapply()lapply()似乎這裏的邏輯:

sapply(iris, function(x) class(x) %in% c("integer","numeric")) 

這給:

> sapply(iris, function(x) class(x) %in% c("integer","numeric")) 
Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
     TRUE   TRUE   TRUE   TRUE  FALSE 

沃斯注意到在你的循環中,你正在增長numericvars向量在循環的每次迭代中;在R中,這是一個很大的禁忌!它迫使R每次複製和擴展向量。預先分配足夠的存儲空間並填寫對象;在這裏,將意味着創造numericvars作爲

numericvars <- character(length = ncol(iris)) 

然後在循環做

nams <- names(iris) 
for(i in seq_len(ncol(iris))) { 
    if(class(iris[, i]) == 'integer' | class(iris[, i]) == 'numeric') { 
     numericvars[i] <- nams[i] 
    } 
} 

多一點的工作,但效率高得多,雖然你只看到它時迭代次數變大。

4

這是有點緊張:

R> sapply(colnames(iris), function(x) inherits(iris[,x], c("numeric","integer"))) 
Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
     TRUE   TRUE   TRUE   TRUE  FALSE 
R> 
+0

Ooops。猜猜我太遲了。 –

+0

是否有任何理由將'sapply'放在列名上,而不是'data.frame'本身? 'sapply(虹膜,繼承,c(「數字」,「整數」))' – Marek

4

還有colwise(),在plyr numcolwise()catcolwise()colwise()將對矢量進行操作的函數轉換爲在數據幀上按列方式工作的函數。 numcolwisecatcolwise提供了分別僅對數字和離散變量進行操作的版本。在一個循環中

library(plyr) 
colwise(is.numeric)(Data) 

> colwise(is.numeric)(Data) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   TRUE  TRUE   TRUE  TRUE FALSE