折叠 R 中(凌乱的)字符变量的多个因子级别

Collapsing multiple factor levels of (messy) character variable in R

我很难在 R Studio 中将多个因子水平分解为一个特定变量的三个因子水平。

我的出发点是 data.table,其中包含 250 个变量和大约 4,000 行。对于一个因子变量,我想将它的 75 个级别合并为 3 个级别。此外,在 75 个级别中,有 4 个级别应该被忽略(或之前设置为 NA),因为它们包含有争议的信息。此因子变量基于调查答案,其中还包括文本格式的个人答案。有时甚至语言也不同。所以,有点乱。

我试图以两种不同的方式将这 75 个级别(如果之前各自的观察设置为 NA,则为 71 个级别)折叠为 3 个。但是,R 在控制台中总是 returns a + 而不是 >,我无法继续执行任何其他命令。当然,我可以通过点击 Esc 来停止它,但这并不能帮助我收到我想要的结果。

所以,这个假想的例子应该展示我的尝试:

1) 使用 levelslist 函数

levels(dt$x) <- list("No"=c("I don't allow anything", "..."), 
"Yes"= c("Number of visitors ,annual sales, sales growth, number of customers", "Net sales", "..."), 
"Maybe"=c("The CEO's approval is needed.", "To be discussed"))

2) 使用 forcats

dt$x %>%
fct_collapse(No= c("I don't allow anything", "..."), 
Yes= c("Number of visitors ,annual sales, sales growth", "number of customers", "Net sales", "..."), 
Maybe=c("The CEO's approval is needed.", "To be discussed"))

我假设问题是由于原始变量的结构引起的。有谁知道我该如何解决这个问题?

非常感谢!

最好的, 伊尔卡

dt$x 肯定是 "factor"。要为因子列分配不同的值,您应该首先将数据转换为 "character" 类型

class(dt$x) # should be factor
dt$x <- as.character(dt$x)
class(dt$x) # should be "character"  

# a list of collapsed Categories
toCollapseCategories <- list(
    "No"=c("I don't allow anything", "..."), 
    "Yes"= c("Number of visitors ,annual sales, sales growth, number of customers", "Net 
           sales", "..."), 
    "Maybe"=c("The CEO's approval is needed.", "To be discussed")
)

dt$x[dt$x %in% toCollapseCategories$No] <- "No"
dt$x[dt$x %in% toCollapseCategories$Yes] <- "Yes"
dt$x[dt$x %in% toCollapseCategories$Maybe] <- "Maybe"

# and then get a factor
dt$x <- as.factor(dt$x)
class(dt$x) # factor

当然可以优化代码但是dt$x应该是一个字符才能替换元素

我的一个朋友实际上提供了答案。与数据结构无关

这完成了工作:

dt$x <- fct_collapse(dt$x, 
                          No = c(
                            "I don't allow anything", 
                             "..."),
                          Yes= c(
                             "Number of visitors ,annual sales, sales growth",
                             "number of customers", 
                             "Net sales", 
                             "..."),
                          Maybe= c(
                              "The CEO's approval is needed.", 
                              "To be discussed")
                               )

我仍然不知道为什么我在上面发布的第一个选项不起作用(它与另一个变量完美结合)。

我在 github 上写了一个函数 xfactor 来帮助解决这种情况。它允许使用正则表达式匹配对因子水平进行重新编码,因此对于处理混乱的数据很有用。它还允许您使用 'exclude' 语句通过正则表达式匹配来降低因子水平。

devtools::install_github("jwilliman/xfactor")
library(xfactor)

dt$x <- xfactor::xfactor(dt$x, levels = c(
  No = "don't|never",
  Yes = "sales|visitors|customers",
  Maybe = "approval|discuss"),
  exclude = "irrelevant", ignore.case = TRUE)
  )

有关更多示例,请参阅

顺便说一句,如果 R 在控制台中返回 + 而不是 >,您可能在某处错过了结束 )"