假设您有一个像这样的data.frame:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
您如何仅选择x中的数字列?
答案 0 :(得分:244)
编辑:更新以避免使用不明智的sapply
。
由于数据框是一个列表,我们可以使用list-apply函数:
nums <- unlist(lapply(x, is.numeric))
然后是标准子集
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的特殊怪癖,更简单,更强大,可用于数据库后端元素:
dplyr::select_if(x, is.numeric)
答案 1 :(得分:62)
dplyr软件包的select_if(
)功能是一个优雅的解决方案:
library("dplyr")
select_if(x, is.numeric)
答案 2 :(得分:24)
Filter()
是该用例的完美函数:
你只需编码:
Filter(is.numeric, x)
它也比select_if()
快得多:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
返回(在我的计算机上)Filter
的中位数为60微秒,dplyr
的中位数为21 000微秒(快350倍)。
答案 3 :(得分:4)
如果您只对列名感兴趣,请使用:
names(dplyr::select_if(train,is.numeric))
答案 4 :(得分:3)
这是其他答案的替代代码:
x[, sapply(x, class) == "numeric"]
使用data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
答案 5 :(得分:3)
library(purrr)
x <- x %>% keep(is.numeric)
答案 6 :(得分:2)
库PCAmixdata具有functon splitmix,它可以分割给定数据帧的定量(数值数据)和定性(分类数据)&#34; YourDataframe&#34;如下图所示:
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)
答案 7 :(得分:2)
iris %>% dplyr::select(where(is.numeric)) #as per most recent updates
purrr
的另一种选择是取消discard
函数:
iris %>% purrr::discard(~!is.numeric(.))
如果需要数字列的名称,可以添加names
或colnames
:
iris %>% purrr::discard(~!is.numeric(.)) %>% names
答案 8 :(得分:1)
如果您有许多因子变量,则可以使用select_if
功能。
安装dplyr软件包。有许多功能通过满足条件来分离数据。你可以设定条件。
像这样使用。
categorical<-select_if(df,is.factor)
str(categorical)
答案 9 :(得分:1)
另一种方式如下:-
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
答案 10 :(得分:0)
这不是直接回答问题,但可能非常有用,特别是如果你想要除了你的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))
答案 11 :(得分:0)
Numerical_variables <- which(sapply(df, is.numeric))
# then extract column names
Names <- names(Numerical_variables)