我有一个带有一列索引的数据框,以及一个将每个索引映射到一个值的列表。
x <- data.frame( index = c("bob","tom","bob","harry") )
lst <- list( "bob" = 10, "tom" = 20, "harry" = 30 )
我想使用索引列在数据框中创建一个新列(&#34; lookup&#34;)来查找列表中的相应值。我想的就像......
x$lookup <- lst[[ x$index ]] # nope, doesn't work
...可能会起作用,但是作为递归索引的尝试失败了。以下工作,但我想尽可能避免使用循环:
for (i in 1:nrow(x) ) { # works, but is ugly
x[ i, "lookup" ] <- lst[[ as.character( x[i,"index"] ) ]]
}
产生以下预期结果:
> x
index lookup
1 bob 10
2 tom 20
3 bob 10
4 harry 30
有没有办法在不使用循环的情况下完成此操作?
我还惊讶于创造了&#39; x&#39;生成了因子而不是字符串的数据帧列。 正在使用&#39; as.character&#39;在循环中正确索引到列表中的最佳方法是什么?
R和Stackoverflow都是新手,在尝试搜索答案失败后发布了我的第一个问题。为我的新鲜道歉。
答案 0 :(得分:4)
您可以尝试match
x$lookup <- unlist(lst[match(x$index, names(lst))])
x
# index lookup
#1 bob 10
#2 tom 20
#3 bob 10
#4 harry 30
或使用stack/merge
merge(x,stack(lst), by.x='index', by.y='ind')
答案 1 :(得分:2)
(注意:@JChou,OP,在我将其编辑到我的答案中之前找到了此解决方案的正确形式。)
使用不同的括号和字符索引起作用:
x$index <- as.character(x$index)
x$lookup <- unlist( lst[ x$index ] )
[[
一次只能访问列表中的一个元素,而[
则对列表进行子集化。
或者,您可以将index
作为一个因素,但更改其编码以匹配列表的编码。 (虽然我认为这太复杂而不是一个好主意。)
x$index <- factor(x$index, levels=names(lst))
x$lookup <- unlist( lst[ x$index ] )
答案 2 :(得分:1)
我混合了stack
和match
。
x$lookup <- stack(lst)$values[match(x$index, stack(lst)[,2])]
# index lookup
#1 bob 10
#2 tom 20
#3 bob 10
#4 harry 30