我喜欢 plyr
中的 revalue
函数,可以用来替换字符串,它简单易记。
然而,我现在想要迁移到 dplyr
,但是它似乎没有 revalue
函数。在 dplyr
中,如何完成之前用 revalue
完成的任务?
从dplyr_0.5.0版本开始提供了一个名为recode
的函数,它与plyr中的revalue
非常相似。
以下示例来自recode
文档的Examples部分:
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
参数。
chartr("ac", "AC", x)
x <- c("a", "b", "c")
我想评论@aosmith的答案,但我的声誉不够。看来现在的函数的默认设置是不影响未指定的级别。
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"
df[, variable := mapvalues(variable, old = old_names_string_vector, new = new_names_string_vector)]
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"
library(plyr); library(dplyr)
。 - Axeman