从数据框中的某些因素创建字符串 - “For”循环似乎是不必要的

时间:2012-11-16 03:19:19

标签: r

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

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);
}

1 个答案:

答案 0 :(得分:2)

您的数据不是示例中的data.frame,但是没关系,无论

,以下内容都可以

paste已经过矢量化,因此问题就在于*applyfor loops

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

您可以添加xlist是否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" (或其他变量)。

data.table

如果您的数据是library(data.table) DT <- as.data.table(test.results) DT[, paste(First, Third)] ,那么您可以执行以下操作

with

或者您可以坚持使用列表和data.frames并使用evalqevalq(paste(First,Third), test.results)

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

{{1}}