折叠 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) 使用 levels
和 list
函数
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 在控制台中返回 +
而不是 >
,您可能在某处错过了结束 )
或 "
!
我很难在 R Studio 中将多个因子水平分解为一个特定变量的三个因子水平。
我的出发点是 data.table
,其中包含 250 个变量和大约 4,000 行。对于一个因子变量,我想将它的 75 个级别合并为 3 个级别。此外,在 75 个级别中,有 4 个级别应该被忽略(或之前设置为 NA),因为它们包含有争议的信息。此因子变量基于调查答案,其中还包括文本格式的个人答案。有时甚至语言也不同。所以,有点乱。
我试图以两种不同的方式将这 75 个级别(如果之前各自的观察设置为 NA,则为 71 个级别)折叠为 3 个。但是,R 在控制台中总是 returns a +
而不是 >
,我无法继续执行任何其他命令。当然,我可以通过点击 Esc
来停止它,但这并不能帮助我收到我想要的结果。
所以,这个假想的例子应该展示我的尝试:
1) 使用 levels
和 list
函数
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 在控制台中返回 +
而不是 >
,您可能在某处错过了结束 )
或 "
!