在 R 中从 "value" 获取 "key"
Obtain "key" from "value" in R
我创建了一个列表,它本身由多个列表组成。我正在尝试确定一种从 "value" 获取 "key" 的有效方法。 IE。如果我指定 ("cat" 或 "dog"), ("fish" 或 "chicken"), ("horse" 或 "donkey") 我如何 return "pet"、"food" 和 "work"。我试图创建一个带有 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]]
}
我的尝试看起来像这样,但希望我可以使用某种 which( %in%) 语句来做更多 efficiently/compactly。
f <- function(x)
{
ret <- NULL
for (i in animals)
{
if(x == animal.list[[i]][["a"]] | x == animal.list[[i]][["b"]])
{
ret <- i
}
}
}
您可以使用 stack
创建查找 table,然后使用 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
您可以 select 使用单个括号而不是双括号的列表的多个元素。将其与 any
和 %in%
相结合:
# ("cat" or "dog")
idx <- sapply( animal.list, function(x) any( x %in% c("cat", "dog")) )
names( animal.list )[ idx ]
我创建了一个列表,它本身由多个列表组成。我正在尝试确定一种从 "value" 获取 "key" 的有效方法。 IE。如果我指定 ("cat" 或 "dog"), ("fish" 或 "chicken"), ("horse" 或 "donkey") 我如何 return "pet"、"food" 和 "work"。我试图创建一个带有 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]]
}
我的尝试看起来像这样,但希望我可以使用某种 which( %in%) 语句来做更多 efficiently/compactly。
f <- function(x)
{
ret <- NULL
for (i in animals)
{
if(x == animal.list[[i]][["a"]] | x == animal.list[[i]][["b"]])
{
ret <- i
}
}
}
您可以使用 stack
创建查找 table,然后使用 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
您可以 select 使用单个括号而不是双括号的列表的多个元素。将其与 any
和 %in%
相结合:
# ("cat" or "dog")
idx <- sapply( animal.list, function(x) any( x %in% c("cat", "dog")) )
names( animal.list )[ idx ]