通过使用另一列索引到列表中,在数据框中创建一个新列?

时间:2015-07-07 18:54:43

标签: r list indexing

我有一个带有一列索引的数据框,以及一个将每个索引映射到一个值的列表。

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都是新手,在尝试搜索答案失败后发布了我的第一个问题。为我的新鲜道歉。

3 个答案:

答案 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)

我混合了stackmatch

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