为什么使用 paste in for loop return 会出错?

Why does using paste in for loop return error?

关于同一主题,我有几个问题。

(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 
    ...

然而,它returnsError: $ operator is invalid for atomic vectors,即使我在这里没有使用$运算符。

(2) 另外, 我想创建一个列 'year',其中包含相关年份的重复值,并试图遍历此列:

premium1999$year <- 1999

我在其中写道:

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

在这种情况下,它 returns 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),])
}

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

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

每个代码单独工作都很好。

我找不到我做错了什么。任何帮助或建议将不胜感激。

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

为了便于理解,"data1999_mod"["Estimate"]data1999_mod["Estimate"]之间存在巨大差异。仅通过 paste0() 函数 returns 将前者子集化为数据框,但是,预期输出将仅由后者给出。这就是为什么你得到 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),])
}