为什么使用paste in for loop会返回错误?

问题描述 投票:0回答:1

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

(1)我正在尝试循环。

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

for 10年,我在其中写道。

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

注:for 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

我也试着在其他一些类似的东西上循环,但我总是得到Error。

每个代码都能单独正常工作。

我找不到我做错了什么。如果有任何帮助或建议,我将非常感激。

r for-loop paste
1个回答
1
投票

这段代码的问题在于,粘贴0()函数返回了这个字符,而不是调用作为这个字符的名称的对象。比如说 paste0('data',year,'_mod') 返回一个长度为1的字符向量,即。"data1999_mod" 而不是调用对象 data1999_mod.

为了便于理解,两者之间有很大的区别。"data1999_mod"["Estimate"]data1999_mod["Estimate"]. 仅仅通过粘贴0()函数将数据框子集返回前者,然而,预期的输出将只由后者给出。这就是为什么你会得到。Error: $ operator is invalid for atomic vectors.

在你所有的代码中都发现了同样的错误。为了通过粘贴0()函数的输出来调用对象,我们需要用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),])
}
© www.soinside.com 2019 - 2024. All rights reserved.