【问题标题】:Select categorical variables where number of levels is equal to 1选择级别数等于 1 的分类变量
【发布时间】:2015-10-07 01:53:22
【问题描述】:

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

感谢您的帮助和时间

【问题讨论】:

  • 可能是indx &lt;- sapply(df[,cat], nlevels)==1; df[,cat][,indx]
  • 不错!我想到了length(levels())
  • @akrun 您的线路运行良好。非常感谢您的回复。它返回一个带有 TRUE/FALSE 的逻辑,这取决于它是否是 1 级分类变量。我会将其标记为正确答案。
  • 我将其发布为解决方案。感谢您的反馈。

标签: r apply sapply data-cleaning


【解决方案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 已从“因子”更改为“字符”,因为apply 的输出是matrix,而matrix 只能包含一个类。如果有任何非数字列,它将整个矩阵列转换为“字符”类。您可以将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) 

【讨论】:

  • indx &lt;- sapply(df[,cat], nlevels)==1 这里是说没有括号闭合
  • @ShailajaGuptaKapoor 这是一个奇怪的错误,因为我在该代码中没有看到任何问题
  • 请看我下面的回答,我面临的问题
  • @ShailajaGuptaKapoor 我得到indx &lt;- sapply(df[,cat], nlevels)==1; &gt; indx V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
  • 我有一个名为 train_1 的数据框。我试图找出级别 > 2 indx &lt;- sapply(df[,cat], nlevels(df[,cat])&gt;2) df[,cat][,indx, drop=FALSE] 的分类变量错误:indx &lt;- sapply(df[,cat], nlevels(df[,cat])&gt;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
【解决方案2】:

我有一个名为 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

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

【讨论】:

  • 在您的代码中,最后一个 ) 不平衡,即 sapply(df[,cat], nlevels(df[,cat])&gt;2) 而应该是 sapply(df[,cat], nlevels(df[,cat])&gt;2
  • 错误:出现意外符号:"indx &lt;- sapply(df[,cat], nlevels(df[,cat])&gt;2 indx"
  • 任何可能丢失的库?
  • 不,只是最后的) 造成了问题。你不需要) 在 2 之后
  • 你能把)末尾的indx &lt;- sapply(df[,cat], nlevels(df[,cat])&gt;2)改正一下吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多