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()
等々。