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

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

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


当前回答

来自基本包的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倍)。

其他回答

来自基本包的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倍)。

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

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

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

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

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

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

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

library("dplyr")
select_if(x, is.numeric)
library(purrr)
x <- x %>% keep(is.numeric)