【问题标题】:Match Vector to multiple columns, return index and corresponding value in other column将 Vector 匹配到多个列,返回其他列中的索引和对应值
【发布时间】:2017-05-17 10:23:29
【问题描述】:

我有一个数据框:

a = c(1, 2, 3, 4, 9) 
b = c(5, 6, 7, 8, 10) 
c = c('xx','yy','zz', 'kk', 'bb') 
df = data.frame(a, b, c) 

> df
  a  b  c
1 1  5 xx
2 2  6 yy
3 3  7 zz
4 4  8 kk
5 9 10 bb

还有一个整数向量:

> names
[1] 1 3 5 8
Levels: 1 3 5 8

我可以返回df 中的索引,其中names 匹配列ab,使用match

> match(names, df$a)
[1]  1  3 NA NA
> match(names, df$b)
[1] NA NA  1  4

我想结合上面两个语句,对于返回的索引,返回c列中对应的值,对于那个特定的索引,这样我的输出是:

out = [1] "xx" "zz" "xx" "kk"

我尝试过:

> df$c[match(names, df$a) | match(names, df$b)]
[1] "xx" "yy" "zz" "kk" "bb"

但由于这是一个布尔测试,它不能按要求运行。

我怎样才能达到我想要的输出?非常感谢。

【问题讨论】:

    标签: r dataframe match


    【解决方案1】:

    我们可以尝试使用c 并指定nomatch = 0

    df$c[c(match(names, df$a, nomatch = 0), match(names, df$b, nomatch=0))]
    #[1] xx zz xx kk
    #Levels: bb kk xx yy zz
    

    如果我们想要 character 类,用 as.character 包装它

    【讨论】:

    • 感谢您的回答。这代表了我的数据的一个简单版本。在我的真实数据中,当我运行这个命令时,我会得到很多零,而应该有一个值,例如c(match(names, df$a, nomatch = 0)) 给出[1] 0 0 0 0 0 116 0c(match(names, df$b, nomatch=0)) 给出[1] 247 87 40 335 220 0 227c(match(names, df$a, nomatch = 0), match(names, df$b, nomatch=0)) 给出[1] 0 0 0 0 0 116 0 知道为什么 0 不会被其他匹配案例的值替换吗?
    • R 索引中的@ChuckM 从 0 开始。即使有 0 也不使用
    • 好的。但这意味着数据帧子集采用 0 而不是取值,即它没有得到df$c[247 87 40 335 220 116 227],而是得到df$c[0 0 0 0 0 116 0 247 87 40 335 220 0 227],这是不正确的。目前,这种方式将b 索引附加到a 索引的末尾,而不是根据需要将它们切片在一起。是否可以保留订单并自动删除 0?
    • 谢谢,我在这里找到了方法stackoverflow.com/questions/12511476/…。非常感谢您的帮助:)
    【解决方案2】:
    df$c[c(which(df$a %in% names) , which(df$b %in% names))]
    
    # [1] xx zz xx kk
    

    【讨论】:

    • 谢谢!将尝试使用我更大的数据集,看看它是如何工作的。
    猜你喜欢
    • 2020-02-21
    • 2021-02-23
    • 2023-04-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多