【问题标题】:Why does using paste in for loop return error?为什么在 for 循环中使用粘贴会返回错误?
【发布时间】:2020-05-14 16:14:16
【问题描述】:

我有一些关于同一主题的问题。

(1) 我正在尝试循环:

premium1999 <- as.data.frame(coef(summary(data1999_mod))[c(19:44), 1])

10 年,我在其中写道:

for (year in seq(1999,2008)) { 
    paste0('premium',year) <- as.data.frame(coef(summary(paste0('data',year,'_mod')))[c(19:44), 1])
}

注意: data1999_mod 是回归结果,我想将它的一些估计器提取为数据框向量。 coef(summary(data1999_mod)) 看起来像这样:

#A matrix: ... of type dbl
             Estimate        Std. Error     t value    Pr(>|t|)
    age      0.0388573570  2.196772e-03   17.6883885  3.362887e-6
    age_sqr -0.0003065876  2.790296e-05  -10.9876373  5.826926e-28
    relation 0.0724525759  9.168118e-03    7.9026659  2.950318e-15
    sex     -0.1348453659  8.970138e-03  -15.0326966  1.201003e-50
    marital  0.0782049161  8.928773e-03    8.7587533  2.217825e-18
    reg      0.1691004469  1.132230e-02   14.9351735  5.082589e-50 
    ...

但是,即使我在这里没有使用$ 运算符,它也会返回Error: $ operator is invalid for atomic vectors

(2) 另外, 我想创建一个包含相关年份的重复值的列“年”,并试图循环这个:

premium1999$year <- 1999

我在其中写道:

for (i in seq(1999,2008)) {
    assign(paste0('premium',i)[['year']], i) 
}

在这种情况下,它返回Error in paste0("premium", i)[["year"]]: subscript out of bounds

(3) 此外,我想重复一些行并循环:

premium1999 <- rbind(premium1999, premium1999[rep(1, 2),])

又过了 10 年,我写道:

for (year in seq(1999,2008)) {
    paste0('premium',year) <- rbind(paste0('premium',year), paste0('premium',year)[rep(1, 2),])
}

这次返回Error in paste0("premium", year)[rep(1, 2), ]: incorrect number of dimensions

我也尝试遍历其他一些类似的东西,但总是出错。

每个代码单独运行良好。

我找不到我做错了什么。非常感谢任何帮助或建议。

【问题讨论】:

  • 对于你的问题 1,试试这个: for (year in seq(1999,2008)) { assign (paste0('premium',year), ) } 在我看来你正在使用不必要的循环。如果您指定示例数据输入和预期输出(请不要截图),它会更容易提供帮助。
  • 我试过了,但它仍然返回相同的错误。我将编辑有关线程上有关 (1) 问题的更多信息。我想从第 19 行到第 44 行的“data1999_mod”中提取回归估计器作为数据框。

标签: r for-loop paste


【解决方案1】:

代码的问题是 paste0() 函数返回字符,而不是调用名称为该字符的对象。例如,paste0('data',year,'_mod') 返回一个长度为 1 的字符向量,即"data1999_mod",并且不调用对象data1999_mod

为了便于理解,"data1999_mod"["Estimate"]data1999_mod["Estimate"] 之间存在巨大差异。仅通过 paste0() 函数作为数据帧的子集返回前者,但是,预期的输出将仅由后者给出。这就是你得到Error: $ operator is invalid for atomic vectors的原因。

在您的所有代码中都发现了相同的错误。为了通过 paste0() 函数的输出调用对象,我们需要用 get() 括起来。

由于您没有提供可重现的样品,我无法对其进行测试。不过,您可以尝试运行这些。

#(1)

for (year in seq(1999,2008)) { 
  paste0('premium',year) <- as.data.frame(coef(summary(get(paste0('data',year,'_mod'))))[c(19:44), 1])
}


#(2)

for (i in seq(1999,2008)) {
  assign(get(paste0('premium',i))[['year']], i) 
}


#(3)

for (year in seq(1999,2008)) {
  paste0('premium',year) <- rbind(get(paste0('premium',year)), get(paste0('premium',year))[rep(1, 2),])
}

【讨论】:

  • 非常感谢。我尝试了你给我的代码,但第一个和第三个仍然返回错误 ,第二个返回错误 。实际上我之前也尝试过使用 get() ,但都没有成功..
  • 您能否更新一个最小的可重现样本,以便我可以运行代码并编辑我的答案?
  • 嗨。非常感谢你。我想我知道问题出在哪里。毕竟代码 get() 有效。但是,由于 paste0(),左侧仍然返回“premium1999”。因此,我创建了一个列表来存储每个数据帧,以便可以通过例如 premium[["premium1999"]] 来调用它。通过这样做,我可以在括号内使用 paste0() ,它可以工作。非常感谢您对 paste0() 代码的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2011-10-02
  • 1970-01-01
相关资源
最近更新 更多