【问题标题】:Iterating over list in R [duplicate]迭代R中的列表[重复]
【发布时间】: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 &lt;- "variable2",我们不能使用variable1 ~ x。相反,我们必须建立公式。
  • 附带说明,使用list() 创建列表通常最有用,如果其中的对象可能是不同的类型、字符的混合、数字或更复杂的对象(如另一个列表)。如果您要收集相同原子类型的东西,比如字符串,只需使用c()。
  • 您的问题不是“迭代列表”,而是XY problem。它是“从指定变量构造公式”。而且你甚至不需要使用变量名,你可以使用数据框/矩阵的列。所以这是现有问题的重复。

标签: r formula lm


【解决方案1】:

在 lm() 函数中使用 formula() 来使用写成字符串的公式。并且不要费心使用列表。例如:

VBPersonasMulti = data.frame(open = rnorm(100, 3, 2),
  attempted = rnorm(100,1,2),
  completed = rnorm(100,-1,3))

colnames <- c('attempted','completed')

for (colname in colnames) {
  print(colname)
  anal <- lm(formula(paste('open ~' , colname)), data = VBPersonasMulti)
  plot(anal)
}

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2018-04-26
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多