Select 水平数等于 1 的分类变量
Select categorical variables where number of levels is equal to 1
在数据挖掘中进行预处理有时涉及重新分组和重新编码分类变量。众所周知,一旦您在 R 中重新编码分类变量(即函数 mapvalues
),您需要使用 df$variable <- factor(df$variable)
更新您的分类变量,以便您可以查看 [=24= 中的实际水平数] 与 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
我的问题是:一旦我更新了我的数据集,我怎么能 select 列的级别数等于 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
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
从 'factor' 更改为 'character' 因为 apply
的输出是 matrix
和 matrix
只能容纳一个 class。如果有任何非数字列,它会将整个矩阵列转换为 'character' class。您可以将 apply
用于 numeric
矩阵,因为 return class 也将是“数字”。一般来说,当有混合class列时,最好使用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)
我有一个名为 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
我的猫有这么多分类变量,但是这个输出很奇怪。打开,例如
没有促销栏
在数据挖掘中进行预处理有时涉及重新分组和重新编码分类变量。众所周知,一旦您在 R 中重新编码分类变量(即函数 mapvalues
),您需要使用 df$variable <- factor(df$variable)
更新您的分类变量,以便您可以查看 [=24= 中的实际水平数] 与 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
我的问题是:一旦我更新了我的数据集,我怎么能 select 列的级别数等于 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
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
从 'factor' 更改为 'character' 因为 apply
的输出是 matrix
和 matrix
只能容纳一个 class。如果有任何非数字列,它会将整个矩阵列转换为 'character' class。您可以将 apply
用于 numeric
矩阵,因为 return class 也将是“数字”。一般来说,当有混合class列时,最好使用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)
我有一个名为 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
我的猫有这么多分类变量,但是这个输出很奇怪。打开,例如
没有促销栏