用dplyr突变改变因子水平

用dplyr突变改变因子水平,r,dplyr,R,Dplyr,这可能很简单,我觉得问这个问题很愚蠢。我想使用mutate更改数据帧中某个因子的级别。简单的例子: library("dplyr") dat <- data.frame(x = factor("A"), y = 1) mutate(dat,levels(x) = "B") 为什么这不起作用?如何使用mutate()更改因子级别?我不太确定我是否正确理解了您的问题,但是如果您想使用mutate()更改cyl的因子级别,可以执行以下操作: df <- mtcars %>% mut

这可能很简单,我觉得问这个问题很愚蠢。我想使用mutate更改数据帧中某个因子的级别。简单的例子:

library("dplyr")
dat <- data.frame(x = factor("A"), y = 1)
mutate(dat,levels(x) = "B")

为什么这不起作用?如何使用mutate()更改因子级别?

我不太确定我是否正确理解了您的问题,但是如果您想使用
mutate()更改
cyl
的因子级别,可以执行以下操作:

df <- mtcars %>% mutate(cyl = factor(cyl, levels = c(4, 6, 8)))

我不太确定我是否正确理解了你的问题,但是如果你想用
mutate()
更改
cyl
的因子级别,你可以:

df <- mtcars %>% mutate(cyl = factor(cyl, levels = c(4, 6, 8)))

也许您正在寻找此plyr::重估价值功能:

mutate(dat, x = revalue(x, c("A" = "B")))

您也可以看到plyr::mapvalues。

也许您正在寻找这个plyr::revalues函数:

mutate(dat, x = revalue(x, c("A" = "B")))
您也可以看到plyr::mapvalues。

使用来自的包,这也很容易

mutate(dat, x = fct_recode(x, "B" = "A"))
有了这个软件包,这也很容易

mutate(dat, x = fct_recode(x, "B" = "A"))

您可以使用
dplyr
中的
recode
功能

df <- iris %>%
     mutate(Species = recode(Species, setosa = "SETOSA",
         versicolor = "VERSICOLOR",
         virginica = "VIRGINICA"
     )
)
df%
突变(物种=重新编码(物种,setosa=“setosa”,
versicolor=“versicolor”,
virginica=“virginica”
)
)

您可以使用
dplyr
中的
recode
功能

df <- iris %>%
     mutate(Species = recode(Species, setosa = "SETOSA",
         versicolor = "VERSICOLOR",
         virginica = "VIRGINICA"
     )
)
df%
突变(物种=重新编码(物种,setosa=“setosa”,
versicolor=“versicolor”,
virginica=“virginica”
)
)

无法评论,因为我没有足够的信誉点,但重新编码只对向量有效,因此@Stefano答案中的上述代码应该是

df <- iris %>%
  mutate(Species = recode(Species, 
     setosa = "SETOSA",
     versicolor = "VERSICOLOR",
     virginica = "VIRGINICA")
  )
df%
变异(物种=重新编码(物种,
setosa=“setosa”,
versicolor=“versicolor”,
virginica=“virginica”)
)

无法评论,因为我没有足够的信誉点,但重新编码只对向量有效,因此@Stefano答案中的上述代码应该是

df <- iris %>%
  mutate(Species = recode(Species, 
     setosa = "SETOSA",
     versicolor = "VERSICOLOR",
     virginica = "VIRGINICA")
  )
df%
变异(物种=重新编码(物种,
setosa=“setosa”,
versicolor=“versicolor”,
virginica=“virginica”)
)

根据我的理解,目前接受的答案只改变因子水平的顺序,而不是实际的标签(即因子水平的调用方式)。为了说明级别和标签之间的差异,请考虑下面的例子:

cyl
转换为系数(不需要指定级别,因为它们是按字母数字顺序编码的):

请注意此列与我们的第一列有何不同:

    all(as.character(mtcars4$cyl)!=mtcars3$cyl) 
    #[1] TRUE 
    #Note: TRUE here indicates that all values are unequal because I used != instead of ==
    #as.character() was required as the levels were numeric and thus not comparable to a character vector

更多详情:

如果我们要使用
mtcars2
而不是
mtcars3
更改
cyl
的级别,我们需要以不同的方式指定标签以获得相同的结果。
mtcars2
的标签顺序是:c(4,6,8),因此我们指定新标签如下

    #change labels of mtcars2 (order used to be: c(4, 6, 8)
    mtcars5 <- mtcars2 %>% mutate(cyl = factor(cyl, labels = c("new_value_for_4", 
                                                               "new_value_for_6", 
                                                               "new_value_for_8" )))

根据我的理解,目前接受的答案只改变因子水平的顺序,而不是实际的标签(即因子水平的调用方式)。为了说明级别和标签之间的差异,请考虑下面的例子:

cyl
转换为系数(不需要指定级别,因为它们是按字母数字顺序编码的):

请注意此列与我们的第一列有何不同:

    all(as.character(mtcars4$cyl)!=mtcars3$cyl) 
    #[1] TRUE 
    #Note: TRUE here indicates that all values are unequal because I used != instead of ==
    #as.character() was required as the levels were numeric and thus not comparable to a character vector

更多详情:

如果我们要使用
mtcars2
而不是
mtcars3
更改
cyl
的级别,我们需要以不同的方式指定标签以获得相同的结果。
mtcars2
的标签顺序是:c(4,6,8),因此我们指定新标签如下

    #change labels of mtcars2 (order used to be: c(4, 6, 8)
    mtcars5 <- mtcars2 %>% mutate(cyl = factor(cyl, labels = c("new_value_for_4", 
                                                               "new_value_for_6", 
                                                               "new_value_for_8" )))

也许
dat%>%mutate(x=factor(x,labels='B'))
BTW,管道操作符在代码中不正确,所以我不能在mutate中使用levels()?我需要再次将变量显式编码为一个因子?隐马尔可夫模型。。。(%应该可以,它将管道和分配dat)是的,我想对x进行变异。我想“等级(x)”就足够让“变异”知道我想要变异x了。我想这是一种设计选择,因为它在“内部”中是这样工作的。可以使用
magrittr
或其他软件包,但为什么您需要走这条路线呢。做
levels(dat$x)很容易,这不仅仅是改变因子的级别。它实际上改变了因子本身的值。这似乎很危险,会导致一些奇怪的行为
dat可能
dat%>%mutate(x=factor(x,labels='B'))
BTW,代码中的管道运算符不正确,所以我不能在mutate中使用levels()?我需要再次将变量显式编码为一个因子?隐马尔可夫模型。。。(%应该可以,它将管道和分配dat)是的,我想对x进行变异。我想“等级(x)”就足够让“变异”知道我想要变异x了。我想这是一种设计选择,因为它在“内部”中是这样工作的。可以使用
magrittr
或其他软件包,但为什么您需要走这条路线呢。做
levels(dat$x)很容易,这不仅仅是改变因子的级别。它实际上改变了因子本身的值。这似乎很危险,会导致一些奇怪的行为<代码>数据请注意,重新编码仅对向量有效,请参阅PaulFrater提供的答案以获得有效版本。请注意,重新编码仅对向量有效,请参阅PaulFrater提供的答案以获得有效版本。如果级别与原始值不匹配,而不是
因子(cyl,levels=…)
,则应执行
因子(cyl,labels=…)
。例如<代码>因子(cyl,labels=c('four','six','eight')
。如果级别与原始值不匹配,而不是
因子(cyl,levels=…)
,则应执行
因子(cyl,labels=…)
。例如
因子(cyl,labels=c('four','six','eight'))
。加载
dplyr
plyr
对我来说都不起作用。各自的函数互相践踏。@DavidTonhofer
dplyr
plyr
已知存在名称空间冲突,但
plyr
已经有一段时间不推荐加载
dplyr
plyr