在一个大型数据集中,识别哪些变量是分类变量,哪些是数值变量。

4
我有一个包含65个变量的列表,我想将数值型和分类变量分开。
这个任务可以用什么命令完成。
2个回答

9
你可以使用splitsapply将变量分组在一起:
split(names(iris),sapply(iris, function(x) paste(class(x), collapse=" ")))
$factor
[1] "Species"

$numeric
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"

请注意使用paste将多个类名合并为一个。这里的对象是多类对象。

谢谢James,这给了我想要的结果。 - user3619169
1
不要在具有时间变量的数据框中使用sapply()函数,否则会失败。 - hadley
2
谢谢@hadley,我进行了编辑,使解决方案更加健壮以应对多类变量的问题。 - James
@Rahul 适用于只有一个类的变量。我添加的额外内容有助于防止多类变量。 - James

5
您可以这样做(假设您的数据框命名为 df):
sapply(df, class)

的确,带有时间变量的输出结果不太美观:

library(lubridate)
df <- data.frame(V1 = character(10),
                 V2 = numeric(10),
                 V3 = ymd(paste("2014-05", 21:30, sep="-")))
sapply(df, class)
##$V1
##[1] "factor"
##
##$V2
##[1] "numeric"
##
##$V3
##[1] "POSIXct" "POSIXt" 

但它仍然可以识别数字或因子变量,就像没有时间变量一样:

names(df)[sapply(df, class) == "factor"]
##[1] "V1"

# for time variable it's less obvious indeed...
names(df)[grepl("POSIXct", sapply(df, class))]
##[1] "V3"

1
不要在类中使用sapply()函数:一旦数据框中有时间变量,这将失败。 - hadley
谢谢您的评论,我已经遇到了这个问题...您建议使用什么?mode - Victorp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接