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
或者factor
。 apply
总是在矩阵上工作 (如果你给它一个数据框,它会先把它转换成一个矩阵) 和 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
现在我们在 x1
和 x2
中看到因子 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)
我正在尝试创建一个函数,允许在 运行 回归分析之前将数据框的选定列转换为分类数据类型(因子)。
问题是如何使用字符串(字符)从数据框中分割特定列。
示例:
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
或者factor
。 apply
总是在矩阵上工作 (如果你给它一个数据框,它会先把它转换成一个矩阵) 和 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
现在我们在 x1
和 x2
中看到因子 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)