R新手,所以提前道歉。我想写一个for循环,它对一系列数据帧进行顺序操作,然后将它们绑定(按序列号)。理想情况下,我认为它会像这样(其中sc2是我正在工作的基本数据框架,week3是使用的选择变量。我要创建的数据帧是t1 t2 t3…还有w1 w2 w3…等。换句话说,数据框架名中的'i'将从for语句中读取。
for(i in 1:16) {
ti= tail((subset(sc2, sc2$week3<i)), n=200)
wi= subset(sc2, sc2$week3==i)
mi=rbind(ti, wi)
}
我肯定你知道这是行不通的。我已经说到这里了-
for(i in 1:16) {
txi= tail((subset(sc2, sc2$week3<i)), n=200)
assign(paste0("trst",i), txi, envir = .GlobalEnv)
wxi= subset(sc2, sc2$week3==i)
assign(paste0("w",i), wxi, envir = .GlobalEnv)
}
创建一个虚拟数据帧(*xi),然后为每个i分配给全局环境。但现在该如何约束它们呢?是否有更优雅的方法来完成所有这些,或者我是否漏掉了动态引用数据框架的方法?
不要在循环中这样做!如果把data frame
放在data frame
里或者我应该把tibble
放在tibble
里。请看下面的例子。
library(tidyverse)
sc2 = tibble(
week3 = sample(1:20, 100, replace = TRUE),
x = rnorm(100)
)
ftxi = function(i) sc2 %>% filter(week3<i)
fwxi = function(i) sc2 %>% filter(week3==i)
df = tibble(id = 1:16) %>%
group_by(id) %>%
mutate(txi = map(id, ~ftxi(.x)),
wxi = map(id, ~fwxi(.x)))
让我们看看df
是什么。
# A tibble: 16 x 3
# Groups: id [16]
id txi wxi
<int> <list> <list>
1 1 <tibble [0 x 2]> <tibble [4 x 2]>
2 2 <tibble [4 x 2]> <tibble [6 x 2]>
3 3 <tibble [10 x 2]> <tibble [6 x 2]>
4 4 <tibble [16 x 2]> <tibble [6 x 2]>
5 5 <tibble [22 x 2]> <tibble [4 x 2]>
6 6 <tibble [26 x 2]> <tibble [4 x 2]>
7 7 <tibble [30 x 2]> <tibble [6 x 2]>
8 8 <tibble [36 x 2]> <tibble [4 x 2]>
9 9 <tibble [40 x 2]> <tibble [3 x 2]>
10 10 <tibble [43 x 2]> <tibble [6 x 2]>
11 11 <tibble [49 x 2]> <tibble [3 x 2]>
12 12 <tibble [52 x 2]> <tibble [4 x 2]>
13 13 <tibble [56 x 2]> <tibble [6 x 2]>
14 14 <tibble [62 x 2]> <tibble [5 x 2]>
15 15 <tibble [67 x 2]> <tibble [5 x 2]>
16 16 <tibble [72 x 2]> <tibble [7 x 2]>
正如你所看到的,它是一个tibble
,其中有其他tibble
。
那么让我们看看是否一切都是正确的,看看第二行。
首先,让我们看一下txi变量df$txi[[2]]
# A tibble: 4 x 2
week3 x
<int> <dbl>
1 1 -0.0829
2 1 -2.15
3 1 -0.949
4 1 -0.0583
现在轮到变量wxidf$wxi[[2]]
# A tibble: 6 x 2
week3 x
<int> <dbl>
1 2 -0.0643
2 2 -0.228
3 2 -0.620
4 2 -1.21
5 2 0.186
6 2 1.19
Bingo你得到你所期望的!这也是一种非常快速的方法。你可以看到我的其他答案在这个论坛
什么是更快/更好:循环在每一行..