【问题标题】:R: row index list from list of column values?R:列值列表中的行索引列表?
【发布时间】:2014-12-05 17:37:53
【问题描述】:

在 R 中,如何根据另一列中的指定值列表索引一个 R 列中的值列表?

我知道如何选择和修改特定的行号,例如:

> foo=data.frame(a=100*1:5,b=LETTERS[5:1])
> foo
    a b
1 100 E
2 200 D
3 300 C
4 400 B
5 500 A
> foo$a[c(1,3,5)]= foo$a[c(1,3,5)] + c(3,2,1)
> foo
    a b
1 103 E
2 200 D
3 302 C
4 400 B
5 501 A

但是,如果我想选择和修改具有“b”值“A”、“E”和“C”的行怎么办?我认为which 可能是正确的工具,但我能想到的最好的工具是:

> foo$a[which(is.element(foo$b,c("A","E","C")))]
[1] 103 302 501

此时我被卡住了,因为虽然我选择了正确的行,但它们的顺序不正确,所以我无法单独修改它们。

【问题讨论】:

    标签: r indexing row


    【解决方案1】:

    如果您不关心匹配订单,则删除is.element 并使用%in% 是一种解决方案

    [编辑] - 也可以删除which

    foo$a[foo$b %in% c("A","E", "C")]
    

    另一种可能性是使用match,它将提供每个元素的索引。

    foo$a[match(c("A","E","C"),foo$b)]
    [1] 500 100 300
    

    【讨论】:

    • 你也可以删除which
    • 这似乎不起作用...foo$a[foo$b %in% c("A","E","C")] 给了我[1] 103 302 501foo$a[which(foo$b %in% c("A","E","C"))] 也是如此
    • match查看我的编辑,我误解了你的问题。我相信这应该可以满足您的需求。
    【解决方案2】:

    这是你想要的吗?

    foo$a[match(c("A","E","C"),foo$b)]
    

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 2019-02-13
      • 2021-12-06
      • 2021-12-17
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      相关资源
      最近更新 更多