假设,你有一个这样的data.frame:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
如何只选择x中的数字列呢?
假设,你有一个这样的data.frame:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
如何只选择x中的数字列呢?
当前回答
这是其他答案的替代代码:
x[, sapply(x, class) == "numeric"]
用一个数据表
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
其他回答
另一种方法可能如下:-
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Numerical_variables <- which(sapply(df, is.numeric))
# then extract column names
Names <- names(Numerical_variables)
这并不能直接回答问题,但非常有用,特别是当你想要除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))
如果你有很多因子变量,你可以使用select_if函数。 安装dplyr包。有许多函数通过满足一个条件来分离数据。你可以设置条件。
像这样使用。
categorical<-select_if(df,is.factor)
str(categorical)
编辑:更新,以避免使用不明智的应用。
由于数据帧是一个列表,我们可以使用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))