0

我有一个数据框,并根据一些因素进行选择。我想要一个从因子级别创建的名称向量。希望这足以表明意图:

test.results <- list(
  First  = factor(c('A', 'B'), levels=c('A', 'B', 'C')),
  Second = factor(c('E', 'F'), levels=c('E', 'F', 'G')),
  Third  = factor(c('X', 'Y'), levels=c('X', 'Y', 'Z'))
  )

# cols <-  c('First', 'Third'); TestName(test.results, cols) should return c('A X', 'B Y')

这是一个实现。有没有办法避免显式的“for”循环?

TestName <- function(X, cols) {
  result <- character(length(cols))
  space <- '';
  for (i in cols) {
    result <- paste0(result, space, X[[i]]);
    space <- ' ';
  }
  return(result);
}
4

1 回答 1

2

您的数据不是示例中的 data.frame,但没关系,以下内容将起作用

paste是矢量化的,所以就问题而言,应该不需要*applyorfor loops

testname <- function(x, .names){ do.call(paste, x[.names])}
testname(test.results, c('First','Third'))
## [1] "A X" "B Y"

您可以添加检查是否x是 alist并且names存在于x.

编辑 -sep如果您愿意,可以设置(或其他变量)。

testname <- function(x, .names,...){ do.call(paste, c(x[.names], list(...)))}
testname(test.results, c('First','Third'), sep = '---')
## "A---X" "B---Y"

如果您的数据是 adata.table那么您可以执行以下操作

library(data.table)
DT <- as.data.table(test.results)

DT[, paste(First, Third)]

或者你可以坚持使用列表和 data.frames 并使用withevalq

evalq(paste(First,Third), test.results)

或者

with(test.results, paste(First, Third))
于 2012-11-16T03:26:16.403 回答