2017-11-10 2 views
0

私は、各行のDTの最初の列を他の列にあるuser_idと等しくするためのきれいな方法を見つけようとしています。つまり、各行で "user_id"の検索を実行し、インスタンスが見つかったセルの全体を返す必要があります。R列の値を文字列検索に基づく他の列の値に設定する

最初に、部分一致が見つかった列のインデックスを取得してから、これを使用して最初の列の値を設定しようとしましたが、機能しませんでした。例:、私は次のよう

**user_id** 
    user_id154 
    user_id301 
    user_id2 

を得ることが

例えば
 user_id   1    2 
    1:  N/A   300  user_id154 
    2:  N/A user_id301 user_id125040 
    3:  N/A   302   user_id2 

たい(私は仕事のほとんどはJSONを清掃関与していない私はRの書式などのデータに新しいです念頭に置いてください。 files ..)、そして私のdata.tableは1M行を超えています。答えは超効率的である必要はありませんが、間違いなく5分以上かかってはいけません。それとも、私の上司が遅すぎると考えられますか?

うまくいけば、それはあなたのテーブル内のすべての行のためにそれで"user_id"を持っており、コラムuser_idにつながる入れgrep最初の値に理解

+0

こんにちは!私には言い訳がありますが、どのように行2を選びたいですか? 「user_id301」と「user_id125040」の2つの一致があります。 – Ale

+0

theresに 'user_id'という行がない場合はどうなりますか? – PoGibas

+0

@Ale、間違いを修正しました。 – Shannou06

答えて

0

です。

df$user_id <- apply(df, 1, function(x) grep("user_id", x, value = TRUE)[1]) 
+1

魅力的に動作し、効率的です。ありがとう! – Shannou06

+0

@ Shannou06助けてくれてありがとう:-) – PoGibas

1

私は誰かがよりエレガントなソリューションを提供します確信しているが、これはトリックん:これは最初はすべての列の行ごとの行は、各行のために、探し

dt[, user_id := str_extract(str_c(1, 2), "user_id[0-9]*")] 

を兼ね備え結合された値の最初のuser_id。

(stringrパッケージが必要)

+0

これは機能しますが、PoGibasが提供するソリューションはより簡単に一般化できます。ありがとうございました! :) – Shannou06

関連する問題