2

在 R 中,我有一个带有行名的矩阵,我想给每一行一个额外的标签/属性。也就是说,根据我测试的一些标准,我想使用 apply 或(一些高阶函数)遍历矩阵中的所有行,并为每一行提供一个额外的标签/属性(什么是正确的 R词汇在这里?)。例如,我想将矩阵中的每一行标记为“红色”、“蓝色”或“白色”。

  1. 如何使用高阶函数标记矩阵“红色”、“蓝色”或“白色”中的每一行?
  2. 1. 没有高阶函数而只有循环,我该怎么做?

非常感谢所有帮助。

4

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 回答