5

いくつかのデータフレームに分割された R のかなり大きなデータセットに取り組んでいます。

問題は、セット全体でいくつかのことを行うことです.時々、セットの一部を操作したり変更したりする必要があり、セレクターが非常に扱いにくくなっています.fe

aListOfItems$attribute4([aListOfItems$attribute1 == true & aListOfItems$attribute2 == 6
& aListOfItems$attribute3 == "C"),] <- aListOfItems([aListOfItems$attribute1 == true &   
aListOfItems$attribute2 == 6 & aListOfItems$attribute3 == "C"),aListOfItems$attribute5]
* aListOfItems([aListOfItems$attribute1 == true & aListOfItems$attribute2 == 6 &
aListOfItems$attribute3 == "C"),aListOfItems$attribute7]

(これにより、すべてのエントリの選択された部分の属性 4 が (attribute5 * attribute6) に設定されます。)

これは、読んで、理解し、編集するのが恐ろしいことです。

これらを別のデータフレームに分割することは、RAM のために実際にはオプションではありません。また、このデータを定期的に更新し、すべての個別のデータフレームを再構築することも苦痛になるためです。

それで、次のようなことをする方法はありますか

items_t6C <- &(aListOfItems([aListOfItems$attribute1 == true & aListOfItems$attribute2
 == 6 & aListOfItems$attribute3 == "C"),]

だから私は使うことができます

items_t6C$attribute4 <- # do something

あるいは、そのようなセレクターを文字列変数に格納して使用することは可能でしょうか?

4

2 に答える 2

7

最初に論理ベクトルを作成し、意味のある名前を付けて、コマンドで使用できます。スクリプトは少し長くなりますが、読みやすくなります。

interesting_bit = with(aListOfItems, attribute1 &   
                                     attribute2 == 6 & 
                                     attribute3 == "C")

さらに、少しインデントを使用すると、コードがはるかに読みやすくなります。

aListOfItems$attribute4[interesting_bit,] <- 
     aListOfItems[interesting_bit,aListOfItems$attribute5]
   * aListOfItems[interesting_bit,aListOfItems$attribute7]

を使用withinすると、読みやすくなります。

aListOfItems[interesting_bit,] = within(aListOfItems[interesting_bit,], {
      attribute4 = attribute5 * attribute7
   }

また、論理の場合、明示的にテストする必要はありません== true:

interesting_bit = aListOfItems$attribute1 &   
         aListOfItems$attribute2 == 6 & aListOfItems$attribute3 == "C"

これにより、最終的にこれが削減されます。

aListOfItems$attribute4([aListOfItems$attribute1 == true & aListOfItems$attribute2 == 6
& aListOfItems$attribute3 == "C"),] <- aListOfItems([aListOfItems$attribute1 == true &   
aListOfItems$attribute2 == 6 & aListOfItems$attribute3 == "C"),aListOfItems$attribute5]
* aListOfItems([aListOfItems$attribute1 == true & aListOfItems$attribute2 == 6 &
aListOfItems$attribute3 == "C"),aListOfItems$attribute7]

これに( の追加の使用に注意してくださいwith):

interesting_bit = with(aListOfItems, attribute1 &   
                                     attribute2 == 6 & 
                                     attribute3 == "C")
aListOfItems[interesting_bit,] = within(aListOfItems[interesting_bit,], {
      attribute4 = attribute5 * attribute7
   }

このコードは難しそうに見えないだけでなく、元のコードから推測するのが非常に難しい、何をしているかを即座に伝えます。

于 2013-04-05T09:19:54.347 に答える