R 使用ifelse修改因子变量中的级别

R 使用ifelse修改因子变量中的级别,r,tidyverse,r-factor,R,Tidyverse,R Factor,当我遇到这种奇怪的情况时,我想通过将两个级别归为一个来修改因子变量中的级别。基本上,我的新关卡已创建,但所有剩余关卡似乎都已移至下一关卡。下面是我的示例数据、使用的代码和输出 library(tidyverse) data <- structure(list(factor1 = structure(c(1L, 1L, 2L, 3L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1

当我遇到这种奇怪的情况时,我想通过将两个级别归为一个来修改因子变量中的级别。基本上,我的新关卡已创建,但所有剩余关卡似乎都已移至下一关卡。下面是我的示例数据、使用的代码和输出

library(tidyverse) 
data <- structure(list(factor1 = structure(c(1L, 1L, 2L, 3L, 1L, 2L, 
        1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
        1L, 1L, 1L, 3L, 1L, 1L, 1L, 4L), .Label = c("0", "1", "2", "3", 
        "4", "5", "6", "7"), class = "factor")), row.names = c(NA, -30L
        ), class = c("tbl_df", "tbl", "data.frame"), .Names = "factor1")
data_out <- data %>% mutate(factor1 = ifelse(factor1 %in% c('0', '1'), 
                                             factor1, '>1'))
structure(list(factor1 = c("1", "1", "2", ">1", "1", "2", "1", 
"1", "2", "2", "2", "2", "2", "1", "2", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", ">1", "1", "1", "1", ">1")), .Names = "factor1", 
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -30L))
库(tidyverse)

数据我猜这个问题围绕着因子的构造方式。我仍然不清楚一个因子是如何通过
mutate
从{“0”,“1”}级变为{“1”,“2”,“1”}级的

R因子实际上是基1整数向量,其属性是它们的级别。所以你的“0”级别最初实际上是整数-1,而你的“1”级别是整数-2。显然,
mutate
功能适合创建一个新的因子,该因子具有一个额外的级别,打印为“>1”,但也将“0”级别重新分配给一个新的“1”级别,“1”级别重新分配给一个“2”级别。在我看来,这在
mutate
这一部分似乎是一种危险的行为。我认为它应该给你一个级别为“0”、“1”、“1”的新因子,或者它应该抛出一个错误

错误来自于
ifelse
,尽管
mutate
通过将新列也变成一个因子来计算问题。如果将
数据
强制为数据帧,则会看到:

data$factor2 <- ifelse( data$factor1 %in% c('0', '1'), 
                                              data$factor1, '>1')
data
#-------- same issue except
   factor1 factor2
1        0       1
2        0       1
3        1       2
4        2      >1
.... delete the other 26 rows
> str(data)
'data.frame':   30 obs. of  2 variables:
 $ factor1: Factor w/ 8 levels "0","1","2","3",..: 1 1 2 3 1 2 1 1 2 2 ...
 $ factor2: chr  "1" "1" "2" ">1" ...

以防将来有人遇到类似问题,并寻找一种简单的方法将这些因素分组,而不重新分配剩余的因素:

fct_collapse(data$factor1, '>1' = c('2', '3')) 

如果您想在解释部分重新打开它,请告诉我,但我想它归结为
ifelse
做得比您预期的少。您可以在命令行中键入
ifelse
,查看其代码并运行它。@Frank:孩子,这些答案肯定没有向我解释这种行为。@42-当然,很公平。这实际上是一个由两部分组成的问题,这些问题回答的是“如何做”部分,而不是“如果我在这里失败了,
ifelse
有什么特别的方法?”部分。(作为OP的参考,我们分开讨论的链接显示在“链接”下方的侧栏中。)@jakes:我不知道Frank在谈论哪一个链接。@42-,我的解释也不清楚,我重新相信了我的直觉。非常感谢!我正在使用
recode\u factor
编写一个不同的答案。很高兴看到它的用法。我知道你对我结束这个问题很生气(即使我立即评论说如果OP不满意,我会重新打开),但是你的开场白是“噪音”,如果你真的关心我在做什么,你应该在评论或聊天中。我们在dplyr软件包中,还有一个forcats软件包可能在这里有用(?…不确定,我自己没有用过,但它也出现在前面的链接中。)@Frank:我真的希望你在写答案。我想你可能比我更了解
ifelse
替换的机制;我的误解在那里。无论如何,使用示例
x逐行运行
ifelse
fct_collapse(data$factor1, '>1' = c('2', '3'))