在 R 中,我有一个带有行名的矩阵,我想给每一行一个额外的标签/属性。也就是说,根据我测试的一些标准,我想使用 apply 或(一些高阶函数)遍历矩阵中的所有行,并为每一行提供一个额外的标签/属性(什么是正确的 R词汇在这里?)。例如,我想将矩阵中的每一行标记为“红色”、“蓝色”或“白色”。
- 如何使用高阶函数标记矩阵“红色”、“蓝色”或“白色”中的每一行?
- 1. 没有高阶函数而只有循环,我该怎么做?
非常感谢所有帮助。
在 R 中,我有一个带有行名的矩阵,我想给每一行一个额外的标签/属性。也就是说,根据我测试的一些标准,我想使用 apply 或(一些高阶函数)遍历矩阵中的所有行,并为每一行提供一个额外的标签/属性(什么是正确的 R词汇在这里?)。例如,我想将矩阵中的每一行标记为“红色”、“蓝色”或“白色”。
非常感谢所有帮助。
我想到了两种实现。
(1)使用data.frame
(2)维护矩阵(更快)并有一个单独的向量用于索引
myDF <- as.data.frame(myMatrix)
myDF$color <- apply(myDF, 1, ColoringFunction)
# grab all the "red" ones
myDF[myDF$color=="red", ]
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>)
用来确定颜色分配的函数。
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()
等等。