使R中的(杂乱)字符变量具有多个折合度

问题描述 投票:0回答:2

我难以在R Studio中将多个因子级别分解为一个特定变量的三个因子级别。

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

我试图以两种不同的方式将这75个级别(如果各个观测值之前设置为NA,则将其缩小为71个级别)。但是,R在控制台中始终返回+而不是>,并且我无法继续执行任何其他命令。当然,我可以通过按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"))

我认为问题是由于原始变量的结构而引起的。有谁知道我该如何解决?

非常感谢您!

最好,伊尔卡

r character factors levels
2个回答
0
投票

dt $ x当然是一个“因素”。要将不同的值分配给因子列,您应该首先将数据转换为“字符”类型

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应该是字符,以便替换元素


0
投票

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

此工作:

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")
                               )

我仍然不知道为什么第一个选项不起作用(它对另一个变量起作用)。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.