【问题标题】:How to refer to data frames dynamically in an R for loop?如何在 R for 循环中动态引用数据帧?
【发布时间】:2021-09-20 21:41:07
【问题描述】:

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 分配给全局环境。但是现在如何 rbind 呢?有没有更优雅的方式来完成这一切,还是我错过了动态引用数据帧的方式?

【问题讨论】:

  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: r for-loop


【解决方案1】:

不要循环执行! 这可以通过在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

现在轮到变量 wxi df$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 你得到了你所期望的! 这也是一种非常快速的方法。你可以在这个论坛看到我的其他答案
What is faster/better: Loop over each row..

【讨论】:

  • 非常感谢!就像我说的,一个新手,但这看起来是一个很酷的解决方案。如上所述,我在每个单元格中都得到了带有小标题的小标题。我仍在研究如何绑定(追加)它们,然后对它们进行操作(可能在函数中?),但这是一个开始!
  • 我很高兴能帮上忙。请记住,在 Stack Overflow 上,您可以通过选择已批准的解决方案来表示感谢。
猜你喜欢
  • 2014-10-18
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多