【问题标题】:Is there an alternative to "revalue" function from plyr when using dplyr?使用 dplyr 时,是否可以替代 plyr 的“重估”功能?
【发布时间】:2016-08-05 13:47:10
【问题描述】:

我喜欢 revalue 函数是 plyr 用于替换字符串。它简单易记。

但是,我已将新代码迁移到 dplyr,它似乎没有 revalue 函数。在 dplyr 中,以前用 revalue 做的事情被接受的成语是什么?

【问题讨论】:

标签: r string dplyr plyr


【解决方案1】:

dplyr 版本 dplyr_0.5.0 开始有一个 recode 函数可用,它看起来与 plyr 中的 revalue 非常相似。

根据recode 文档示例部分构建的示例:

set.seed(16)
x = sample(c("a", "b", "c"), 10, replace = TRUE)
x
 [1] "a" "b" "a" "b" "b" "a" "c" "c" "c" "a"

recode(x, a = "Apple", b = "Bear", c = "Car")

   [1] "Car"   "Apple" "Bear"  "Apple" "Car"   "Apple" "Apple" "Car"   "Car"   "Apple"

如果你只定义了一些你想重新编码的值,默认情况下,其余的都用NA填充。

recode(x, a = "Apple", c = "Car")
 [1] "Car"   "Apple" NA      "Apple" "Car"   "Apple" "Apple" "Car"   "Car"   "Apple"

可以使用.default 参数更改此行为。

recode(x, a = "Apple", c = "Car", .default = x)
 [1] "Car"   "Apple" "b"     "Apple" "Car"   "Apple" "Apple" "Car"   "Car"   "Apple"

如果您想用其他东西替换缺失值,还有一个 .missing 参数。

【讨论】:

【解决方案2】:

我们可以使用来自base Rchartr 来做到这一点

chartr("ac", "AC", x)

数据

x <- c("a", "b", "c")

【讨论】:

  • 我喜欢你总是发布base R 解决方案;无论我走到哪里,你都在那里@akrun +1。此外,您将如何使用两个长向量来做到这一点?比如说example here
  • @ÁlvaroA.Gutiérrez-Vargas 谢谢。我查看了您显示的链接。它显示了一个向量。链接可能不同
【解决方案3】:

我想评论@aosmith 的答案,但缺乏声誉。现在看来dplyrrecode函数的默认设置是不影响未指定的级别。

x = sample(c("a", "b", "c"), 10, replace = TRUE)
x
[1] "c" "c" "b" "b" "a" "b" "c" "c" "c" "b"

recode(x , a = "apple", b = "banana" )

[1] "c"      "c"      "banana" "banana" "apple"  "banana" "c"      "c"      "c"      "banana"

要将所有未指定的级别更改为NA,应包含参数.default = NA_character_

recode(x, a = "apple", b = "banana", .default = NA_character_)

[1] "apple"  "banana" "apple"  "banana" "banana" "apple"  NA       NA       NA       "apple" 

【讨论】:

    【解决方案4】:

    我觉得很方便的一个替代方法是 data.tables 的 mapvalues 函数 例如

    df[, variable := mapvalues(variable, old = old_names_string_vector, new = new_names_string_vector)]
    

    【讨论】:

      【解决方案5】:

      R 基础解决方案

      您可以为此使用base 中的ifelse()。函数参数是ifelse(test, yes, no)。举个例子:

      (x <- sample(c("a", "b", "c"), 5, replace = TRUE))
      [1] "c" "a" "b" "a" "a"
      
      ifelse(x == "a", "Apple", x)
      [1] "c"     "Apple" "b"     "Apple" "Apple"
      

      如果您想重新编码多个值,您可以像这样以嵌套方式使用该函数:

      ifelse(x == "a", "Apple", ifelse(x == "b", "Banana", x))
      [1] "c"      "Apple"  "Banana" "Apple"  "Apple"
      

      自带功能

      有许多必须重新编码的值会使ifelse() 的编码变得混乱。因此,这里有一个自己的函数:

      my_revalue <- function(x, ...){
        reval <- list(...)
      
        from <- names(reval)
        to <- unlist(reval)
      
        out <- eval(parse(text= paste0("{", paste0(paste0("x[x ==", "'", from,"'", "]", "<-", "'", to, "'"), collapse= ";"), ";x", "}")))
      
        return(out)
      }
      

      现在我们可以非常快速地更改多个值:

      my_revalue(vec= x, "a" = "Apple", "b" = "Banana", "c" = "Cranberry")
      [1] "Cranberry" "Apple"     "Banana"      "Apple"     "Apple"  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-11
        • 1970-01-01
        • 2021-09-26
        • 2020-05-21
        • 1970-01-01
        • 2021-08-14
        相关资源
        最近更新 更多