选择级别数等于1的分类变量

时间:2015-07-17 10:54:48

标签: r apply sapply data-cleansing

在数据挖掘中进行预处理有时会涉及对分类变量进行重新分组和重新编码。众所周知,一旦您在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...

感谢您的帮助和时间

2 个答案:

答案 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的输出是matrixmatrix只能包含一个类。如果有任何非数字列,它会将整个矩阵列转换为&#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

我的猫中有很多分类变量,但是此输出很奇怪。打开,“促销”列不存在,例如