在数据挖掘中进行预处理有时涉及对分类变量进行重新分组和重新编码。众所周知,一旦您在 R 中重新编码分类变量(即函数 mapvalues
),您需要使用 df$variable <- factor(df$variable)
更新您的分类变量。这样您就可以使用 str(df)
查看 data.frame 中的实际级别数.
我编写了一段代码来自动更新数据集的分类变量:
cat <- sapply(df, is.factor) #Select categorical variables
names(df[ ,cat]) #View which are they
A <- function(x) factor(x) #Create function for "apply"
df[ ,cat] <- data.frame(apply(df[ ,cat],2, A)) #Run apply function
str(df) #Check
我的问题是:更新数据集后,如何选择级别数等于 1 的列?我尝试过这些行但没有运气:
cat <- sapply(df, is.factor) #Select categorical variables
categorical <- df[,cat] #Create a df named "categorical" separating them
A <- function(x) nlevels(x)==1 #Create "A" function for apply
x <- data.frame(apply(categorical,2, A)) #Run apply function
utils::View(x) #Check and see it is not working...
感谢您的帮助和时间
最佳答案
您可以使用 sapply
创建逻辑索引并使用它来过滤列。原因
indx <- sapply(df[,cat], nlevels)==1
df[,cat][,indx, drop=FALSE]
或者另一个选项是过滤器
Filter(function(x) nlevels(x)==1, df[,cat])
或者
Filter(Negate(var), df[,cat])
关于为什么apply
不起作用,
apply(df[cat], 2, nlevels)
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 0 0 0 0 0 0 0 0 0 0
所有列的输出均为0
,因此有些内容不正确。经进一步核实
apply(df[cat], 2, class)
# V1 V2 V3 V4 V5 V6
#"character" "character" "character" "character" "character" "character"
# V7 V8 V9 V10
#"character" "character" "character" "character"
并且可以找到正确的类
sapply(df[cat], class)
# V1 V2 V3 V4 V5 V6 V7 V8
#"factor" "factor" "factor" "factor" "factor" "factor" "factor" "factor"
# V9 V10
#"factor" "factor"
列的 class
从“因子”更改为“字符”,因为 apply
的输出是一个 matrix
和一个 matrix
只能容纳一个类。如果有任何非数字列,它将把整个矩阵列转换为“字符”类。您可以对numeric
矩阵使用apply
,因为返回类也将是“numeric”。一般来说,当存在混合类列时,最好使用lapply/vapply
并获取逻辑向量,所以sapply
也很有用。
数据
set.seed(64)
df <- as.data.frame(matrix(sample(LETTERS[1:3], 3*10, replace=TRUE), ncol=10))
df <- cbind(df, V11=1:3)
cat <- sapply(df, is.factor)
关于r - 选择级别数等于 1 的分类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31474195/