0

私は次のようにフォーマットされたシートを持っています:

F   NF  C   NF  C   F   C   F   NF
F   NF  C   C   F   NF  NF  C   F
NF  C   F   F   NF  C   C   F   NF
NF  C   F   C   F   NF  F   NF  C
C   F   NF  F   NF  C   NF  C   F
C   F   NF  NF  C   F   F   NF  C
F   C   NF  NF  F   C   C   NF  F
F   C   NF  C   NF  F   NF  F   C
NF  F   C   F   C   NF  C   NF  F
NF  F   C   C   NF  F   F   C   NF
C   NF  F   F   C   NF  NF  F   C
C   NF  F   NF  F   C   F   C   NF

このシートを使用して特定の項目に値を設定し、さまざまなことを実行したいと考えています (詳細については議論する価値がないと思います)。変数「a」、「b」、および「c」を、3 つの異なる文字列 (F、NF、および C) 内の NF の位置と等しくなるように設定したいと考えています。たとえば、for ループを使用して最初の行を読み取り、a を 2、b を 1 に設定し (NF は 3 列の 2 番目のセットの「最初の」列にあるため)、c を 3 に設定します。一連の処理を行います (NF は 3 列目の 3 番目のセットの「3 番目」の列にあるため)。その後、2 行目を読み取り、a を 2、b を 3、c を 1 に設定します。

醜い量のifステートメントを使用する以外に、これを行う方法は考えられません。代替手段はありますか?

ありがとう

4

1 に答える 1

1

applyテーブルの各行に対して単純な関数を実行するか、この場合、テーブルの特定の列を選択して、applyそれらの列の各行に対して関数を実行できます。

> text = "F   NF  C   NF  C   F   C   F   NF
+ F   NF  C   C   F   NF  NF  C   F
+ NF  C   F   F   NF  C   C   F   NF
+ NF  C   F   C   F   NF  F   NF  C
+ C   F   NF  F   NF  C   NF  C   F
+ C   F   NF  NF  C   F   F   NF  C
+ F   C   NF  NF  F   C   C   NF  F
+ F   C   NF  C   NF  F   NF  F   C
+ NF  F   C   F   C   NF  C   NF  F
+ NF  F   C   C   NF  F   F   C   NF
+ C   NF  F   F   C   NF  NF  F   C
+ C   NF  F   NF  F   C   F   C   NF"
> x = read.table(text=text)
> a = apply(x[1:3], 1, function(vec) which(vec == "NF"))
> a
 [1] 2 2 1 1 3 3 3 3 1 1 2 2
> b = apply(x[4:6], 1, function(vec) which(vec == "NF"))
> b
 [1] 1 3 2 3 2 1 1 2 3 2 3 1
> c = apply(x[7:9], 1, function(vec) which(vec == "NF"))
> c
 [1] 3 1 3 2 1 2 2 1 2 3 1 3

の 2 番目の引数applyは、関数を適用するテーブルのディメンションを指定します。1 は行、2 は列です。

于 2013-07-09T04:14:39.033 に答える