2016-07-04 5 views
0

私はデータフレームtab1を持っています。以下のような結果を含む10行50列を想像してください。データフレームに適用されるgrep +ループ

tab1のすべてのフィールドで文字列morseを検索したいとします。私はまた、すべての行に対してこれを実行したい。 私は実際には以下のコードで動作結果を得るのですが、私は、コードの下に置かれている、私は理解していない2つのこと

tab1$str<-NA 
for(i in 1:10) { 
    str<-grep("morse", tab1[i,], ignore.case=TRUE) 
    tab1$str[i] <- str 
} 

Error in tab1$str[i] <- str : replacement has length zero 

tab1$str 
[1] 44 NA NA NA NA NA NA NA NA NA   

##the first row, column44 did indeed contain the string, whilst the others did not. 

質問があります:私は必要ですか、なぜ

  1. は、最初の行? tab1$str <- NA。これがなければ、文字列morseが含まれていなくても、ベクトルtab1$strのすべての値が 44であると、 の結果は正しくありません。
  2. 結果が の場合でも、エラーメッセージが表示されるのはなぜですか?

一般的に私はコーダーではなく、再帰的に行を指定するとこれは簡単であると考えました。

ご協力いただきありがとうございます。

答えて

0

あなたの質問から、あなたが探しているものは本当に明確ではありませんが、おそらくループを完全に避けるためにapplyファミリを使用することができます。この模擬データを使用すると、次の関数はすべての行に対してリスト要素を返し、どの列に「モールス」エントリがあるかを示します:

tab1 <- data.frame(a=sample(c("morse", "other", "foo", "top"), 10, replace = T), b = sample(c("morse", "other", "foo", "top"), 10, replace = T), c = sample(c("morse", "other", "foo", "top"), 10, replace = T)) 

apply(tab1,1, function(x) grep("morse",x)) 
+0

...これはまさに私が探していたものです。私はそれをまだ完全に理解していませんが、私が探していた結果があります。多くのおかげで、申し訳ありませんがあなたの答えを投票するために十分なポイントをまだ持っていない。 – James

+0

喜んで助けてください。 '関数rを適用する'のためのグーグルがあなたを助けるかもしれない。答えの横のチェックマークをクリックすると、最も役に立つ回答を受け入れることができます。 –

0

のご質問にお答えするには:

  1. あなたはgrep()計算の各パスの要素を追加forループでの反復リスト(データフレームの列)を初期化するtab1$str <- NAを必要としています。
  2. エラーメッセージは、特定の反復がNULLの値またはlogical(0)の長さの未定義の値を返すため、ベクトルの要素に割り当てることができないため、grep()が原因です。

あなたがデータフレームにネストされたリストを割り当てていると、あなたは論理的にgrep()が返すことがNULL値をチェックしませんので、しかし、あなたの上記のアプローチが最適ではありません。 をifelse()とするベクトル化手法を考えてみます。これは、各列と行を再帰的にチェックするデータフレームの次元に等しい行列を返します。 grep()の下に列の"Morse"値の行インデックスが返されます。

morse_matrix <- sapply(df, function(x) ifelse(grepl("Morse", x), grep("Morse", x), NA)) 

morse_list <- sapply(df, function(x) ifelse(grep("Morse", x), grep("Morse", x), NA)) 

morse_df <- data.frame(morse_matrix) 
+0

'grepl'は' NULL'値を気にするよりも適切かもしれません。 – thelatemail

+0

ありがとう - もう一度すばらしい答え - 私の学習でまだベクトル化されたコードやapply()関数に達していないが、私はそれらを認識していた。あなたの答えの結果として、私はgrepとgreplと答えを返す方法についてもっと学びました - 大きな助けとなりました – James

関連する問題