我们如何替换R中向量中的元素?

时间:2015-12-11 09:45:52

标签: r

让我们说,我有一个载体

animal <- c('cat','snake','cat','pigeon','snake')

一个名为

的数据框
map <- data.frame(find=c('cat','snake','pigeon'),replace=c('mammal','reptile','bird')

现在我想通过将动物的每个元素与地图的替换列相匹配来使用地图修改动物。所以我期待:

animal <- c('mammal','reptile','mammal','bird','reptile')

如果不在第一个向量的每个元素上使用循环,我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

您可以使用recode(animal, map$find, map$replace) 功能:

match

答案 1 :(得分:2)

您可以将animal视为一个因素并重命名其级别。 例如,使用plyr包:

library(plyr)
animal <- c('cat','snake','cat','pigeon','snake')
animal2 <- revalue(animal, c("cat" = "mammal", 
                             "snake" = "reptile", 
                             "pigeon" = "bird"))

> animal
[1] "cat"    "snake"  "cat"    "pigeon" "snake" 
> animal2
[1] "mammal"  "reptile" "mammal"  "bird"    "reptile"

根据以下评论的要求自动生成

repl <- as.character(map$replace)
names(repl) <- map$find
animal2 <- revalue(animal, repl)

> animal
[1] "cat"    "snake"  "cat"    "pigeon" "snake" 
> animal2
[1] "mammal"  "reptile" "mammal"  "bird"    "reptile"

答案 2 :(得分:1)

为此我使用简单的recode函数。作为输入,您需要更改向量,表示为x,值向量为from,替换值向量为to(因此from[1]将被重新编码为{{ 1}}),您可以指定to[1]值,而other以外的所有值都会重新编码为from。您可以找到下面粘贴的功能。

other

使用您自己的示例,用法是

recode <- function(x, from, to, other) {
  stopifnot(length(from) == length(to))

  new_x <- x
  k <- length(from)
  for (i in 1:k) new_x[x == from[i]] <- to[i]

  if (!missing(other) && length(other) > 1) {
    new_x[!(x %in% from)] <- other[1]
    warning("'other' has length > 1 and only the first element will be used")
  }

  new_x
}