2011-02-25 98 views
4

我有腦痙攣。下面是一個玩具數據集:查找特定值的列索引

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

我有,我想在一組定義的列找到特定的價值,我想找出它位於位置我正在尋找的字段是字符和。訣竅是我正在尋找的價值可能不存在。另外,數據集中也存在空字符串。

假設我知道如何做到這一點,變量位置表示我想返回的值。

> 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個變量中存在一次。

生成此重新編碼的最佳方法是什麼?

非常感謝提前。

回答

9

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

+1整齊的一個,我特別喜歡 「NOMATCH」 – aL3xa 2011-02-26 01:16:03

+0

那很好,謝謝。我真的必須學會使用apply函數。 – Btibert3 2011-02-26 16:21:51

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))