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*applyはベクトル化されているので、質問が立っているので、またはの必要はありません。for loops

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

に存在するxかどうかに関するチェックを追加できます。listnamesx

編集-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)]

または、リストとdata.framesに固執して、withまたはevalq

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

また

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