为什么使用 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),])
}
关于同一主题,我有几个问题。
(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),])
}