【问题标题】:Finding the Column Index for a Specific Value查找特定值的列索引
【发布时间】:2011-07-04 15:57:03
【问题描述】:

我的脑抽筋了。下面是一个玩具数据集:

df <- data.frame(
        id = 1:6, 
        v1 = c("a", "a", "c", NA, "g", "h"),
        v2 = c("z", "y", "a", NA, "a", "g"),
        stringsAsFactors=F)

我有一个特定的值,我想在一组定义的列中找到它,我想确定它所在的位置。我正在搜索的字段是字符,诀窍是我正在寻找的值可能不存在。此外,数据集中还存在空字符串。

假设我知道如何执行此操作,变量 position 表示我希望返回的值。

> df
  id   v1   v2 position
1  1    a    z        1
2  2    a    y        1
3  3    c    a        2
4  4 <NA> <NA>       99
5  5    g    a        2
6  6    h    g       99

一般的规则是我要找到值“a”的位置,如果没有找到或者v1缺失,那么我要返回99。

在本例中,我在 v1 和 v2 中进行搜索,但实际上,我有 10 个不同的变量。还值得注意的是,我正在搜索的值在 10 个变量中只能存在一次。

生成此重新编码的最佳方法是什么?

提前非常感谢。

【问题讨论】:

    标签: r string


    【解决方案1】:

    使用match:

    > df$position <- apply(df,1,function(x) match('a',x[-1], nomatch=99 ))
    > df
      id   v1   v2 position
    1  1    a    z        1
    2  2    a    y        1
    3  3    c    a        2
    4  4 <NA> <NA>       99
    5  5    g    a        2
    6  6    h    g       99
    

    【讨论】:

    • 太好了,谢谢。我真的要学会使用apply函数了。
    【解决方案2】:

    首先,删除第一列:

    df <- df[, -1]
    

    然后,做这样的事情(免责声明:我感到非常困*):

    ( df$result <- unlist(lapply(apply(df, 1, grep, pattern = "a"), function(x) ifelse(length(x) == 0, 99, x))) )
        v1   v2 result
    1    a    z      1
    2    a    y      1
    3    c    a      2
    4 <NA> <NA>     99
    5    g    a      2
    6    h    g     99
    

    * sleepy = 代码未矢量化

    EDIT(略有不同的解决方案,我还是觉得困):

    df$result <- rapply(apply(df, 1, grep, pattern = "a"), function(x) ifelse(length(x) == 0, 99, x))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-03
      • 2017-04-19
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 2022-11-02
      • 1970-01-01
      相关资源
      最近更新 更多