跨多个数据帧或 tibbles 的循环
For Loop across several data frames or tibbles
从 2016 年到 2020 年连续几年我有 5 个 tibbles。我对每组 tibbles 做同样的事情所以我想使用 for-loop 而不是复制和粘贴相同的代码 5 次.我用以下方式命名了 tibbles,最后的数字表示数据的年份:
- alpha_20
- beta_20
- gamma_20
- delta_20
- epsilon_20
我的想法是这样做:
for (i in 16:20) {
alpha_a_[i]<-alpha_[i]%>%
mutate(NEWVAR=1+OLDVAR)%>%
select(NEWVAR, VAR2, VAR3)
beta_a_[i]<-beta_[i]%>%
group_by(PIN)%>%
summarize(sum(VAR1))
# and so on for all 5 tibbles
}
但我认为我没有正确调用 tibble,因为代码在第一次变异时就中断了。我似乎无法弄清楚如何指示它获取以“16”结尾的小标题,然后以“17”结尾的小标题等等。
您可以尝试组合使用 get
、assign
和 paste
。
for (i in 16:20) {
alpha <- get(paste("alpha_", i, sep = "")) %>%
mutate(NEWVAR = 1 + OLDVAR) %>%
select(NEWVAR, VAR2, VAR3)
assign(paste("alpha_a_", i, sep = ""), alpha)
beta <- get(paste("beta_", i, sep = "")) %>%
group_by(PIN) %>%
summarize(sum(VAR1))
assign(paste("beta_a_", i, sep = ""), beta)
# and so on for all 5 tibbles
}
这里发生了几件事。首先,为了实际调用您的 tibble 名称,您需要对字符串名称使用 get()
函数。尝试在命令行中键入“alpha_20”与 get(“alpha_20”)。但是,您现在将其编码为 alpha_[i]
的方式不会生成您想要的字符串。要将您的 tibble 名称生成为字符串,您需要执行类似 get(paste0("alpha_", i))
.
的操作
这只是为了得到你想要的小标题。要在 for 循环中 edit/save 它,查看 assign()
命令(参见 Change variable name in for loop using R)。所以总而言之,您的代码将如下所示:
> require(tidyverse)
> alpha_20 <- data.frame(x = 1:5, y = 6:10)
> alpha_20
x y
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
>
> for (i in 20) {
+ assign(paste0('alpha_', i),
+ get(paste0('alpha_', i)) %>%
+ mutate(z = 11:15))
+ }
> alpha_20
x y z
1 1 6 11
2 2 7 12
3 3 8 13
4 4 9 14
5 5 10 15
从 2016 年到 2020 年连续几年我有 5 个 tibbles。我对每组 tibbles 做同样的事情所以我想使用 for-loop 而不是复制和粘贴相同的代码 5 次.我用以下方式命名了 tibbles,最后的数字表示数据的年份:
- alpha_20
- beta_20
- gamma_20
- delta_20
- epsilon_20
我的想法是这样做:
for (i in 16:20) {
alpha_a_[i]<-alpha_[i]%>%
mutate(NEWVAR=1+OLDVAR)%>%
select(NEWVAR, VAR2, VAR3)
beta_a_[i]<-beta_[i]%>%
group_by(PIN)%>%
summarize(sum(VAR1))
# and so on for all 5 tibbles
}
但我认为我没有正确调用 tibble,因为代码在第一次变异时就中断了。我似乎无法弄清楚如何指示它获取以“16”结尾的小标题,然后以“17”结尾的小标题等等。
您可以尝试组合使用 get
、assign
和 paste
。
for (i in 16:20) {
alpha <- get(paste("alpha_", i, sep = "")) %>%
mutate(NEWVAR = 1 + OLDVAR) %>%
select(NEWVAR, VAR2, VAR3)
assign(paste("alpha_a_", i, sep = ""), alpha)
beta <- get(paste("beta_", i, sep = "")) %>%
group_by(PIN) %>%
summarize(sum(VAR1))
assign(paste("beta_a_", i, sep = ""), beta)
# and so on for all 5 tibbles
}
这里发生了几件事。首先,为了实际调用您的 tibble 名称,您需要对字符串名称使用 get()
函数。尝试在命令行中键入“alpha_20”与 get(“alpha_20”)。但是,您现在将其编码为 alpha_[i]
的方式不会生成您想要的字符串。要将您的 tibble 名称生成为字符串,您需要执行类似 get(paste0("alpha_", i))
.
这只是为了得到你想要的小标题。要在 for 循环中 edit/save 它,查看 assign()
命令(参见 Change variable name in for loop using R)。所以总而言之,您的代码将如下所示:
> require(tidyverse)
> alpha_20 <- data.frame(x = 1:5, y = 6:10)
> alpha_20
x y
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
>
> for (i in 20) {
+ assign(paste0('alpha_', i),
+ get(paste0('alpha_', i)) %>%
+ mutate(z = 11:15))
+ }
> alpha_20
x y z
1 1 6 11
2 2 7 12
3 3 8 13
4 4 9 14
5 5 10 15