从R中的“值”获得“密钥”

时间:2015-01-20 22:57:50

标签: r list indexing key

我创建了一个列表,其中包含多个列表。我试图确定一个有效的方法来获得"键"来自"值"。即如果我指定(" cat"或" dog"),(" fish"或" chicken"),(" horse&# 34;或者"驴")我怎样才能返回"宠物","食物"和"工作"分别。我试图创建一个带有for循环的方法,因为我不确定如何通过名称进行索引处理。

pet <- c("cat", "dog")
food <- c("fish", "chicken")
work <- c("horse", "donkey")

types <- c("pet", "food", "work")

animal.list <- vector(mode = "list", length = length(types))
names(animal.list) <- types

for (i in types)
{
  animal.list[[i]] <-  vector(mode = "list", length = length(c("a", "b")))
  names(animal.list[[i]]) <- c("a", "b")
  animal.list[[i]][["a"]] <- eval(parse(text = i))[[1]]
  animal.list[[i]][["b"]] <- eval(parse(text = i))[[2]]

}

我的尝试看起来像这样,但希望我可以使用某种(%in%)语句来更高效/更紧凑地完成它。

f <- function(x)
{
    ret <- NULL
    for (i in animals)
    {

         if(x == animal.list[[i]][["a"]] | x == animal.list[[i]][["b"]])
         {
             ret <- i
         }
     }

}

2 个答案:

答案 0 :(得分:7)

您可以使用stack创建查找表,然后使用match查找值:

animals <- stack(list(pet=pet, food=food, work=work))
f <- function(x) as.character(animals[match(x, animals[[1]]), 2])

然后:

f("cat")
# [1] "pet"
f("horse")
# [1] "work"

注意%in%只是match的变体。

您还可以使用R内置字符查找:

animal.vec <- as.character(animals[[2]])
names(animal.vec) <- animals[[1]]
animal.vec[c("cat", "horse")]
#   cat  horse 
# "pet" "work

答案 1 :(得分:1)

您可以使用单个括号而不是双精度选择列表的多个元素。将其与any%in%结合使用:

#  ("cat" or "dog")
idx <- sapply( animal.list, function(x) any( x %in% c("cat", "dog")) )
names( animal.list )[ idx ]