查找特定值的列索引

时间:2011-02-25 23:00:53

标签: r string

我有脑痉挛。以下是玩具数据集:

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个变量中存在一次。

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

非常感谢提前。

2 个答案:

答案 0 :(得分:10)

使用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

答案 1 :(得分:1)

首先,删除第一列:

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

* =代码未向量化

编辑(稍微不同的解决方案,我仍然感到困倦):

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