R从列表中迭代DataFrame列,错误:选择了未定义的列
我将列名放在列表中,然后想从数据框中选择这些列。我正在使用以下代码R从列表中迭代DataFrame列,错误:选择了未定义的列,r,dataframe,R,Dataframe,我将列名放在列表中,然后想从数据框中选择这些列。我正在使用以下代码 features <- list(c("Weeks"), c("Weeks","Age")) X = train_linear[,as.character(features[1])] # working fine X = train_linear[,as.character(features[2])] 花了很多时间,但我什么也没发现。如果我这样做的话 X =
features <- list(c("Weeks"), c("Weeks","Age"))
X = train_linear[,as.character(features[1])] # working fine
X = train_linear[,as.character(features[2])]
花了很多时间,但我什么也没发现。如果我这样做的话
X = train_linear[,c("Weeks","Age")]
然后它就完美地工作了。但是我需要创建几个列组合,在这种情况下,列表是我的最佳选择。如果是
[
我们需要取消列表
,或者直接使用[
获取列表
元素
train_linear[, features[[2]]]
无需将用作.character
,因为它已经是一个字符串
问题在于当列表中只有一个元素时,中的coersion为.character
features[1]
#[[1]] # // still a list with one element
#[1] "Weeks"
as.character(features[1]) # // coerces to vector as it calls as.vector
#[1] "Weeks"
as.character(features[2]) # // note the added double quotes
#[1] "c(\"Weeks\", \"Age\")"
现在它是一个字符串而不是两个元素,因为它是通过调用paste
length(as.character(features[2]))
#[1] 1
而如果我们使用[[
,它将返回一个向量
features[[2]]
#[1] "Weeks" "Age"
features[[1]]
#[1] "Weeks"
is.vector(features[[2]])
#[1] TRUE
is.list(features[2])
#[1] TRUE
is.list(features[[2]])
#[1] FALSE
关于为什么选择单个列会返回向量的注释,它与data.frame
的功能有关,其中?Extract
默认为drop=TRUE
x[i,j,…,drop=TRUE]
i、 e.根据Extract帮助页面的用法,当存在单个列、行时,它强制为向量。如果我们需要使用、
分隔行、列索引,那么我们还需要指定drop=FALSE
,或者只需指定不带逗号的列索引或名称
train_linear[, features[[1]], drop = FALSE]
或
顺便说一句,选择单列并没有给出数据帧。多列选择返回一个数据帧。@HammadHassan更新了postGot它。但是现在我没有索引功能[[1]],而是循环使用“features”变量,并将其作为“X=train\u linear[,feature]”来执行因此,如果长度为1,我必须设置条件,然后使用drop=FALSE,否则很好。在功能列上循环太容易了,我应该早一点这样做。@HammadHassan您可以始终添加drop=FALSE
,或者不添加,
,而不是使用if/else条件。我会避免在代码中创建更多的条件,除非它是绝对正确的必要的
train_linear[, features[[1]], drop = FALSE]
train_linear[features[[1]]]