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]]]