如何在R for循环中动态引用数据帧?



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你得到你所期望的!这也是一种非常快速的方法。你可以看到我的其他答案在这个论坛
什么是更快/更好:循环在每一行..

最新更新