假设,你有一个这样的data.frame:

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

如何只选择x中的数字列呢?


编辑:更新,以避免使用不明智的应用。

由于数据帧是一个列表,我们可以使用list-apply函数:

nums <- unlist(lapply(x, is.numeric), use.names = FALSE)  

然后是标准子集

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的特殊癖好,更直接,更健壮地用于数据库后端tibbles:

dplyr::select_if(x, is.numeric)

新版本的dplyr也支持以下语法:

x %>% dplyr::select(where(is.numeric))

来自基本包的Filter()是该用例的完美函数: 你只需要编写代码:

Filter(is.numeric, x)

它也比select_if()快得多:

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

Filter返回(在我的计算机上)中值为60微秒,select_if返回21 000微秒(快350倍)。


这是其他答案的替代代码:

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

用一个数据表

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

dplyr包的select_if()函数是一个优雅的解决方案:

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

如果你有很多因子变量,你可以使用select_if函数。 安装dplyr包。有许多函数通过满足一个条件来分离数据。你可以设置条件。

像这样使用。

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

PCAmixdata库有一个splitmix函数,它可以对给定的数据框架“YourDataframe”进行定量(数值数据)和定性(分类数据)的拆分,如下所示:

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)

这并不能直接回答问题,但非常有用,特别是当你想要除id列和因变量外的所有数字列时。

numeric_cols <- sapply(dataframe, is.numeric) %>% which %>% 
                   names %>% setdiff(., c("id_variable", "dep_var"))

dataframe %<>% dplyr::mutate_at(numeric_cols, function(x) your_function(x))

如果你只对列名感兴趣,那么使用这个:

names(dplyr::select_if(train,is.numeric))

另一种方法可能如下:-

#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])

library(purrr)
x <- x %>% keep(is.numeric)

Numerical_variables <- which(sapply(df, is.numeric))
# then extract column names 
Names <- names(Numerical_variables)

iris %>% dplyr::select(where(is.numeric)) #as per most recent updates

purrr的另一个选项是否定丢弃函数:

iris %>% purrr::discard(~!is.numeric(.))

如果你想要数值列的名称,你可以添加名称或冒号:

iris %>% purrr::discard(~!is.numeric(.)) %>% names