【问题标题】:Create a new column in dataframe by indexing into a list using another column?通过使用另一列索引到列表中来在数据框中创建一个新列?
【发布时间】:2015-09-25 10:35:48
【问题描述】:

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

x <- data.frame( index = c("bob","tom","bob","harry") )
lst <- list( "bob" = 10, "tom" = 20, "harry" = 30 )

我想使用索引列在数据框中创建一个新列(“查找”)以在列表中查找适当的值。我想像......

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

有没有办法在不使用循环的情况下做到这一点?

我还惊讶地发现,创建“x”会生成一个包含因子而不是字符串的数据框列。 在循环中使用“as.character”是正确索引到列表中的最佳方式吗?

R 和 Stackoverflow 的新手,在尝试搜索答案失败后发布我的第一个问题。为我的新鲜感道歉。

【问题讨论】:

    标签: r list indexing


    【解决方案1】:

    你可以试试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')
    

    【讨论】:

    • 哇,你快疯了,谢谢。我尝试使用您的第一个想法,并尝试避免使用匹配。这似乎也有效:x$lookup &lt;- unlist( lst[ as.character( x$index ) ] )
    【解决方案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 ] )
    

    【讨论】:

    • @akrun 我正在考虑将其添加到答案中,但我将把它留在这里:“繁琐的解决方法是必要的,因为因素是最糟糕的。我只发现它们对使用有用与table。”
    【解决方案3】:

    我混合了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
    

    【讨论】:

    • 我看到了。我以为我参加聚会迟到了。你删除了你的?
    • 我之前确实删除了它,然后认为它可能会提供一些选择,所以没有删除。
    • 我喜欢你的。清洁工
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2020-08-06
    • 1970-01-01
    • 2016-06-15
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多