您需要更改
dfData$as.name(strColName) <- factor(dfData$get(strColName))
到
dfData[[strColName]] <- factor(dfData[[strColName]])
您可以为更多的阅读?"[["
。
就你而言,列名是编程生成的,[[]]
是唯一的出路。也许这个例子就足以明确说明的$
问题:
dat <- data.frame(x = 1:5, y = 2:6)
z <- "x"
dat$z
# [1] NULL
dat[[z]]
# [1] 1 2 3 4 5
至于其他的答案
apply
肯定是不行的,因为你申请的功能是as.factor
或factor
。 apply
总是在一个矩阵上工作(如果你给它一个数据帧,它会先将它转换成一个矩阵)并返回一个矩阵,而矩阵中不能有因子数据类。考虑这个例子:
x <- data.frame(x1 = letters[1:4], x2 = LETTERS[1:4], x3 = 1:4, stringsAsFactors = FALSE)
x[, 1:2] <- apply(x[, 1:2], 2, as.factor)
str(x)
#'data.frame': 4 obs. of 3 variables:
# $ x1: chr "a" "b" "c" "d"
# $ x2: chr "A" "B" "C" "D"
# $ x3: int 1 2 3 4
注意,你仍然有字符变量而不是因子。正如我所说的,我们必须使用lapply
:
x[1:2] <- lapply(x[1:2], as.factor)
str(x)
#'data.frame': 4 obs. of 3 variables:
# $ x1: Factor w/ 4 levels "a","b","c","d": 1 2 3 4
# $ x2: Factor w/ 4 levels "A","B","C","D": 1 2 3 4
# $ x3: int 1 2 3 4
现在我们看到的因子类x1
和x2
。
对数据帧使用apply
从来就不是一个好主意。如果阅读的apply
源代码:
dl <- length(dim(X))
if (is.object(X))
X <- if (dl == 2L)
as.matrix(X)
else as.array(X)
你看到的数据帧(其具有2维)将被裹挟第一至矩阵。这非常慢。如果您的数据框列有多个不同的类,则生成的矩阵将只有1个类。谁知道这种强制的结果会是什么。
然而apply
写R中没有C,用普通for
循环:
for (i in 1L:d2) {
tmp <- forceAndCall(1, FUN, newX[, i], ...)
if (!is.null(tmp))
ans[[i]] <- tmp
所以它只不过是一个明确的for
循环你写你自己更好。
我不知道打勾并感谢您的指导。看起来tick对用户来说非常重要 - 在这里很可怕。 – AiRiFiEd