我有一个数据框,并根据一些因素进行选择。我想要一个从因子级别创建的名称向量。希望这足以表明意图:
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);
}
答案 0 :(得分: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
中list
是否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并使用evalq
或evalq(paste(First,Third), test.results)
with(test.results, paste(First, Third))
或
{{1}}