在数据挖掘中进行预处理有时会涉及对分类变量进行重新分组和重新编码。众所周知,一旦您在R中重新编码分类变量(即函数mapvalues
),您需要使用df$variable <- factor(df$variable)
更新分类变量,以便您可以查看data.frame中的实际级别数。 str(df)
。
我编写了一段代码来自动更新数据集的分类变量:
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...
感谢您的帮助和时间
答案 0 :(得分:1)
您可以使用sapply
创建逻辑索引,并使用它来过滤列。原因
indx <- sapply(df[,cat], nlevels)==1
df[,cat][,indx, drop=FALSE]
或另一个选项是Filter
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"
可以从
找到正确的class
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
已从&#39;因素&#39;更改到了角色&#39;因为apply
的输出是matrix
而matrix
只能包含一个类。如果有任何非数字列,它会将整个矩阵列转换为&#39;字符&#39;类。您可以将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)
答案 1 :(得分:1)
我有一个名为train_1的数据框。 1.我正在尝试找出级别> 2且小于20的分类变量。 2.级别> 2
的分类变量找出分类变量
cat <- sapply(train_1, is.factor) #Select categorical variables
级别> 2
indx <- sapply(df[,cat], nlevels(df[,cat])>2)
df[,cat][,indx, drop=FALSE]
错误:
indx <- sapply(df[,cat], nlevels(df[,cat])>2)
Error in match.fun(FUN) :
'nlevels(df[, cat]) > 2' is not a function, character or symbol
> df[,cat][,indx, drop=FALSE]
Error in `[.data.frame`(df[, cat], , indx, drop = FALSE) :
object 'indx' not found
>cat
Store DayOfWeek Date Sales Customers
FALSE FALSE FALSE FALSE FALSE
Open Promo StateHoliday SchoolHoliday
TRUE TRUE TRUE TRUE
filter1<-Filter(function(x) nlevels(x)>2, df[,cat])
head(filter1)
StateHoliday
1 0
1116 0
2231 0
3346 0
4461 0
5576 0
我的猫中有很多分类变量,但是此输出很奇怪。打开,“促销”列不存在,例如