【发布时间】:2013-07-31 07:46:10
【问题描述】:
我需要根据列类型对数据框进行子集化 - 例如,从具有 100 列的数据框中,我只需要保留类型为 factor 或 integer 的列。我已经编写了一个简短的函数来执行此操作,但是 CRAN 上有没有更简单的解决方案或一些内置函数或包?
我目前获取具有请求类型的变量名的解决方案:
varlist <- function(df=NULL, vartypes=NULL) {
type_function <- c("is.factor","is.integer","is.numeric","is.character","is.double","is.logical")
names(type_function) <- c("factor","integer","numeric","character","double","logical")
names(df)[as.logical(sapply(lapply(names(df), function(y) sapply(type_function[names(type_function) %in% vartypes], function(x) do.call(x,list(df[[y]])))),sum))]
}
函数varlist的工作原理如下:
- 对于每个请求的类型和数据框中的每一列,调用“is.TYPE”函数
- 对每个变量进行求和测试(布尔值自动转换为整数)
- 将结果转换为逻辑向量
- 数据框中的子集名称
还有一些数据来测试它:
df <- read.table(file="http://archive.ics.uci.edu/ml/machine-learning-databases/statlog/german/german.data", sep=" ", header=FALSE, stringsAsFactors=TRUE)
names(df) <- c('ca_status','duration','credit_history','purpose','credit_amount','savings', 'present_employment_since','installment_rate_income','status_sex','other_debtors','present_residence_since','property','age','other_installment','housing','existing_credits', 'job','liable_maintenance_people','telephone','foreign_worker','gb')
df$gb <- ifelse(df$gb == 2, FALSE, TRUE)
df$property <- as.character(df$property)
varlist(df, c("integer","logical"))
我之所以问,是因为我的代码看起来非常神秘且难以理解(即使对我来说,我已经在 10 分钟前完成了该功能)。
【问题讨论】:
-
我不确定我是否完全理解你的问题,但为什么不只是像
df[sapply(df, function(x) is.integer(x) || is.logical(x))]这样的东西? -
我经常做这种子集,这就是我尝试创建这个函数的原因——为了简化我的生活。
-
顺便说一句,为什么必须在可重现的示例中包含下载这个相当大的 data.frame ?下次您应该只使用其中一个内置数据集。
-
我会使用 iris 数据集并将其中一个数字列设为整数。出于安全原因,我不喜欢下载数据,也不保证将来可以下载数据。
-
@TomasGreif,您可以采用其中任何一个并添加代码以转换为不同类型作为您的最小示例的一部分。
标签: r