【发布时间】:2019-06-26 13:55:18
【问题描述】:
我是 R 新手,有点困惑!
我正在尝试获取 CSV 的列名,然后对其进行迭代并将它们用作线性模型函数中的键。
我在尝试通过这样获取列名来执行此操作时遇到错误:
columns <- as.list(VBPersonasMulti[0,2:length(VBPersonasMulti)])
然后在 ml 函数中将它们作为键引用
for (i in seq_along(column)) {
anal <- lm(open ~ unlist(column[i]), data = VBPersonasMulti)
}
我尝试过不使用 unlist 和其他几个函数以及 column[[i]]) 上述方法的解决方案将是理想的,但我也遇到了此迭代的动态版本较低的问题
它正在创建一个列名的固定列表,我真的想从 csv 迭代(或重新分配该列):
colnames <- list('attempted','open', 'completed', 'attempted', 'earned', 'commented', 'X7'
, 'logout', 'join', 'leave', 'flag_as_inaproppriate')
for (i in seq_along(colnames)) {
print(colnames[i])
anal <- lm(open ~ unlist(colnames[i]), data = VBPersonasMulti)
plot(anal)
}
但是当代码尝试将列表的成员用作其 lm 函数中的键时,我收到此错误:
model.frame.default(formula = open ~ unlist(colname[i]) 中的错误, 数据 = VBPersonasMulti,: 可变长度不同(为 'unlist(colname[i])' 找到)
如果我尝试使用 colname[i] 或 colname[[i]] 访问列名,我会收到错误:
变量“colname[i]”的类型(列表)无效
很抱歉这个新手问题,如果我很难准确地描述这个问题。
我想要发生的是,对于每个列名,lm 函数将使用列名作为 lm 的第二个参数运行
【问题讨论】:
-
您为什么觉得需要使用列表?另外问题是你的名字是字符串,但你希望它们作为变量......所以一种方法是使用 paste0() 构建公式,然后使用 as.formula() 使其在 lm 中可用。
-
这是处理类似问题的question 的一个示例,还有很多其他问题。您的主要误解是
lm的第一个参数是一个公式。这些是 R 中的特殊对象,通常由 bare symbols 创建,它们是列 names 而不是数据列本身。如果您将列名作为字符,那就不同了,您需要使用paste()和as.formula()构造一个公式。 -
例如,一个公式可能是
variable1 ~ variable2,但如果我们有x <- "variable2",我们不能使用variable1 ~ x。相反,我们必须建立公式。 -
附带说明,使用
list()创建列表通常最有用,如果其中的对象可能是不同的类型、字符的混合、数字或更复杂的对象(如另一个列表)。如果您要收集相同原子类型的东西,比如字符串,只需使用c()。 -
您的问题不是“迭代列表”,而是XY problem。它是“从指定变量构造公式”。而且你甚至不需要使用变量名,你可以使用数据框/矩阵的列。所以这是现有问题的重复。