我正在尝试编写一个可以应用于数据帧的循环。循环将基本检查数据框中的每个变量,并告诉我哪个变量是一个因素。
一个例子:
test1<-c("red","red","blue","yellow")
test1<-as.factor(test1)
test2<-c(1,2,3,4)
variable<-c("test1","test2")
count<-2
for (i in 1:count)
{
if (is.factor(paste(variable[i]))==TRUE)
{
print("This is a factor")
}
}
test1变量应该是一个因子,因此是句子&#34;这是一个因素&#34;应该打印。但没有发生任何事我想知道为什么?
答案 0 :(得分:2)
这是一个评估问题。字符数组“test1”或“test2”不是因素。
> is.factor(get(variable[1]))
[1] TRUE
> is.factor(get(variable[2]))
[1] FALSE
答案 1 :(得分:2)
尝试使用sapply
或lapply
代替您for循环,如下所示:
variable <- data.frame(test1,test2)
sapply(variable,is.factor) # returns a vector
test1 test2
TRUE FALSE
lapply(variable,is.factor) # returns a list
$test1
[1] TRUE
$test2
[1] FALSE
或者您可以轻松使用您的功能而不是is.factor
编辑:(感谢Ananda Mahto)
vapply
甚至比sapply
require(microbenchmark)
microbenchmark(
vapply(variable,is.factor, c(is.factor=FALSE)),
sapply(variable,is.factor),
lapply(variable,is.factor),
times = 10000
)
Unit: microseconds
expr min lq median uq max neval
vapply(variable, is.factor, c(is.factor = FALSE)) 12.248 13.829 14.618 15.409 959.698 10000
sapply(variable, is.factor) 31.608 35.560 36.350 37.534 1159.618 10000
lapply(variable, is.factor) 9.877 11.458 11.853 12.644 935.597 10000