2016-07-08 6 views
0

を含む専用フィールドに印刷する方法:私はそれぞれの行をループにしたいR - 次のコマンドを使用して、文字列一致

table
|V1    |V2     |V3     |V4     |V5     |V6     |V7     |V8     |V9   |V10    | 
|:--------------|:---------------------|:--------------------|:-------------------|:--------------------|:---------------------|:--------------------|:---------------------|:-------------|:----------------| 
|LdBPK_271870.1 |plasma membrane: 0.52 |Golgi apparatus: 0.2 |ER: 0.09   |extracellular: 0.08 |mitochondrial: 0.07 |cytoplasmic: 0.02 |lysosomal: 0.01  |nuclear: 0.01 |peroxisomal: 0.0 | 
|LdBPK_220004.1 |nuclear: 0.56   |cytoplasmic: 0.42 |mitochondrial: 0.01 |peroxisomal: 0.0  |Golgi apparatus: 0.0 |plasma membrane: 0.0 |extracellular: 0.0 |ER: 0.0  |lysosomal: 0.0 | 
|LdBPK_020440.1 |cytoplasmic: 0.54  |nuclear: 0.45  |mitochondrial: 0.0 |Golgi apparatus: 0.0 |peroxisomal: 0.0  |plasma membrane: 0.0 |extracellular: 0.0 |ER: 0.0  |lysosomal: 0.0 | 
|LdBPK_313080.1 |nuclear: 0.6   |cytoplasmic: 0.29 |mitochondrial: 0.06 |peroxisomal: 0.02 |Golgi apparatus: 0.01 |extracellular: 0.01 |plasma membrane: 0.01 |ER: 0.0  |lysosomal: 0.0 | 
|LdBPK_201720.1 |cytoplasmic: 0.89  |nuclear: 0.06  |mitochondrial: 0.02 |peroxisomal: 0.01 |Golgi apparatus: 0.01 |extracellular: 0.0 |plasma membrane: 0.0 |ER: 0.0  |lysosomal: 0.0 | 
|LdBPK_070130.1 |cytoplasmic: 0.61  |nuclear: 0.32  |peroxisomal: 0.05 |mitochondrial: 0.02 |Golgi apparatus: 0.0 |plasma membrane: 0.0 |extracellular: 0.0 |ER: 0.0  |lysosomal: 0.0 | 

と:kable(head(table), format = "markdown")

を私は次のtableを生成しました:

  1. プリント各ラインと印刷のみフィールド上のカラムV1
  2. ループ私の後ろの文字列に一致する文字列

例えば、私は、文字列 "nuclear"の後に、次のコードを実行するとします。文字列の後

最初の行
  1. を、カラムV1(LdBPK_271870.1)の下のフィールドを出力して、
  2. V10および印刷への列V2からスキャン値を含むのみフィールド全体(すなわち「核」 )の文字列 "nuclear"に一致します。
  3. これを私のテーブルのすべての行に繰り返します。

私のtableを考えると、コードは最初の行でV1とV9の下にフィールドを表示します。 2行目で、コードはV1とV2の下のフィールドを表示します。 3番目には、V1とV3の下にあるフィールドが表示されます。それが私のテーブルの終わりに達するまで。出力は2つの列の表になります。最初の列はV1と同じで、2つ目の列は「核」という文字列と、各行に続く値だけです。

大文字の括弧を使用してデータをサブセット化することはできません。後に続く文字列がV2からV10のいずれかの列の下にある可能性があるためです。

+0

なぜ列にある文字列は、角括弧をサブセット化できないという意味ですか? [i、j]要素に "nuclear"という文字列が含まれているかどうかを調べるために各要素をチェックするネストされたforループを想像してみてください。はいの場合はX、そうでない場合はXを実行します。 –

+0

私はループを使用しないで意味... – BCArg

+0

あなたの質問では、ループしたいと言った。 –

答えて

0

これは最速のアプローチではないかもしれませんが(繰り返しごとにベクタを再作成するため)、このようなことを試すことができます。これは、各行の最初の列(V1)と、目的の文字列を含む列のいずれかを表示します。列に目的の文字列がない場合は、V1値が表示されません(しかし、それは問題ではありません)。必要な文字列が1つの列にしか表示されていないことが事前に分かっている場合は、「関連する」ベクトルを長さ1で初期化して列の値を入力することによって、このループを高速化できます。

for(row in 1:nrow(table)) { 
    relevant = c() 
    for(col in 1:ncol(table)) { 
     if(grepl("your_string", table[row, col])) { 
      relevant <- c(relevant, col) 
     } 

    } 
    if(length(relevant) > 0) { 
     print(paste(table[row, 1], table[row, relevant])) 
    } 
} 
+0

パーフェクト、今は完璧に働いていて、欲しいものを正確にやっています。どうもありがとう。 – BCArg

+0

@BCArg大歓迎です!誰かが同じ質問をしている場合にこの回答を受け入れてください。この投稿を参照してください。 –

+0

しかし、2列のテーブルとして出力する方が良いでしょう。私はおそらく、このベクトルを元のテーブルの最初の列にバインドすることができます。 – BCArg

関連する問題