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

标签 r apply sapply data-cleaning

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

相关文章:

r - 如何让 switch() 处理 NA?

r - 如何从 plotrix 包中删除径向饼图中的 0?

python - Pandas 滚动应用功能到整个窗口数据框

r - 哪个 R 实现提供最快的 JSD 矩阵计算?

r - read.xls-读取长度可变的工作表列表及其名称

r - 加速 R 中 sapply 调用中使用的函数

r - 无法在R 3.3.0上安装nloptr软件包

python - Pandas:如何在不循环的情况下使用带有数据帧参数的 applymap/apply 函数

R + 将向量列表合并为单个向量

r - 将数据帧行转换为字符向量时出错