R - 从字符串中获取数据框的列

R - Getting Column of Dataframe from String

我正在尝试创建一个函数,允许在 运行 回归分析之前将数据框的选定列转换为分类数据类型(因子)。

问题是如何使用字符串(字符)从数据框中分割特定列。

示例:

  strColumnNames <- "Admit,Rank"
  strDelimiter <- ","
  strSplittedColumnNames <- strsplit(strColumnNames, strDelimiter)
  for( strColName in strSplittedColumnNames[[1]] ){
    dfData$as.name(strColName) <- factor(dfData$get(strColName))
  }

尝试过:

dfData$as.name()
dfData$get(as.name())
dfData$get()

错误信息: 错误:尝试应用非功能

如有任何帮助,我们将不胜感激!谢谢!!!

你需要改变

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或者factorapply 总是在矩阵上工作 (如果你给它一个数据框,它会先把它转换成一个矩阵) 和 returns 一个矩阵,而你可以矩阵中有因子数据 class。考虑这个例子:

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

现在我们在 x1x2 中看到因子 class。

对数据框使用apply从来都不是一个好主意。如果你阅读了apply的源代码:

    dl <- length(dim(X))
    if (is.object(X)) 
    X <- if (dl == 2L) 
        as.matrix(X)
    else as.array(X)

您看到数据框(具有二维)将首先被强制转换为矩阵。这很慢。如果您的数据框列有多个不同的 class,则生成的矩阵将只有 1 个 class。谁知道这样胁迫的结果会是什么。

然而 apply 是用 R 而不是 C 写的,有一个普通的 for 循环:

 for (i in 1L:d2) {
        tmp <- forceAndCall(1, FUN, newX[, i], ...)
        if (!is.null(tmp)) 
            ans[[i]] <- tmp

所以它并不比您自己编写的显式 for 循环更好。

我会使用不同的方法。

创建一个包含要更改为因子的列名的向量:

factorCols <- c("Admit", "Rank")

然后按索引提取这些列:

myCols <- which(names(dfData) %in% factorCols)

最后,使用 apply 将这些列更改为因子:

dfData[,myCols] <- lapply(dfData[,myCols],as.factor)