2

R には、行名を持つマトリックスがあり、各行に追加のタグ/属性を与えたいと考えています。つまり、私がテストしたいくつかの基準に基づいて、apply or (いくつかの高次関数) を使用してマトリックス内のすべての行を反復処理し、各行に追加のタグ/属性を与えたいと思います (正しい Rここに語彙?)。たとえば、マトリックスの各行に「赤」、「青」、または「白」のタグを付けたいとします。

  1. 高次関数を使用して、マトリックス「赤」、「青」、または「白」の各行にタグを付けるにはどうすればよいですか?
  2. 1.高階関数なしでループだけを行うにはどうすればよいですか?

すべてのヘルプは大歓迎です。

4

2 に答える 2

2

2つの実装が思い浮かびます。
(1) data.frame を使用する
(2) マトリックスを維持し (より高速に)、インデックス付け用のセパレート ベクトルを用意する

(1) data.frame を使用する

 myDF <- as.data.frame(myMatrix)

 myDF$color <- apply(myDF, 1, ColoringFunction)

 # grab all the "red" ones
 myDF[myDF$color=="red", ]

(2) インデックス ベクトルを使用する

 myMatrix # remains a matrix

 ColorIndex <- apply(myMatrix, 1, ColoringFunction)

 # grab all the "red" ones
 myMatrix[ColorIndex =="red", ]

 # to initialize the vector to a given value use: 
 ColorIndex <- rep("green", nrow(myMatrix))

myMatrix元のデータはどこにあり、ColoringFunction(<matrix row>)色の割り当てを決定するために使用している関数です。

于 2013-05-06T17:58:32.607 に答える
1

data.tableここで役立つかもしれません。例:

x <- data.table(A = 1:5, B = jitter(1:5))
x[, Index := ifelse(A < 3, 'red', 'blue')]
setkey(x, Index)

例として、最初の列の 3 未満のものをred、その他すべてをblue... としてタグ付けしていますが、独自の基準があると確信しています。キーが設定されると、そのインデックス/タグの下にある行を取得できます。例えば:

x['blue'] 

data.tableこれを非常に迅速に行います。


または、よりカスタムな方法があります。データを取得する関数、インデックス付け/タグ付けメソッドを用意し、特定のタグの下にある行を取得する方法を返します。

tagger <- function(df, setIndex) {
  indexer <- apply(df, 1, setIndex)
  function(index) df[indexer == index, ]
}

これには、任意のタグ付け方法をフィードできます。例と同じ方法とdata.table同じデータ (データ フレームx) を使用します。

x <- data.frame(A = 1:5, B = jitter(1:5))
setIndex <- function(xx) ifelse(xx$A < 3, 'red', 'blue')
getTag <- tagger(x, setIndex)

タグで行を取得できるようになりました。

getTag('red')

より高度なことをしたい場合は、クラスを使用してみてください。

indexer <- setRefClass('indexer', 
  fields = list(df = 'data.frame', indexing = 'character', setIndex = 'function'),
  methods = list(

  # Initialise.
  initialize = function(df, setIndex, ...) {
    initIndex = apply(df, 1, setIndex)
    callSuper(df = df, indexing = initIndex, setIndex = setIndex, ...)
  },

  # Apply new indxing function.
  newIndex = function(setIndex) .self$setIndex <- setIndex, 

  # Apply an indexing function.
  performIndexing = function() .self$indexing <- apply(df, 1, setIndex),

  # Reapply the index function.
  reIndex = function() performIndexing(),

  # Get a row by tag.
  getTag = function(index) df[indexing == index, ],

  # View the indexes for each row.
  viewIndex = function() data.frame(df, Tag = indexing),

  # Change a tag for some row. 
  changeIndexAt = function(at, new_index) .self$indexing[at] <- new_index
  )
)


# Sample data.
df <- data.frame(A = 1:5, B = jitter(1:5))

# Create.
i <- indexer$new(df = df, setIndex = setIndex)

# Get rows tagged as red.
i$getTag('red')

# Reapply row tagging.
i$reIndex()

# Change the tag for the second row.
i$changeIndexAt(2, 'green')
i$getTag('green')

# View the tags.
i$viewIndex()

等々。

于 2013-05-06T19:33:46.180 に答える