首页 > 解决方案 > 从循环中计算每个新数据帧的行数并将所有内容保存在一个循环中

问题描述

我制作了以下循环,过滤每年(81 到 91 之间)的数据,并从每次迭代中创建一个新的数据框。

for(i in 81:91){
  assign(paste0("SampleSizeGaza",i), GazaTB1[GazaTB1$year==i,])
}

有什么办法可以修改这个循环(或创建一个新的循环)来计算每个新datafames的行数(最好使用nrows)并将其保存到一个有两列的数据帧(例如SampleSize)上,是年(从 81 到 91)和 YearSampleSize(每年每个数据帧的 nrow)。任何帮助表示赞赏

标签: rdataframefor-loop

解决方案


如果您将数据保存在一个对象中,而不是assign用于创建多个对象,则分组操作更易于管理。有两种常见的方法可以做到这一点。

碱基R

以下代码用于split将数据框拆分为一个列表,其中每个数据框的“组”列的唯一值都有一个单独的数据框,然后用于sapply计算列表中的行数。结果是一个命名向量。

df <- data.frame(
  group = sample(letters[1:4], 100, replace = T),
  value = rnorm(100)
)

head(df)
  group      value
1     a  0.3691390
2     b -0.2444268
3     d -0.4776481
4     b -1.5580131
5     a  1.1913923
6     a -2.1483141

df.split <- split(df, df$group)
counts <- sapply(df.split, nrow)

 a  b  c  d 
24 28 16 32 

Tidyverse

或者,我们可以使用tidyverse包直接对数据框执行分组操作,返回汇总数据框:

library(tidyverse)

df.counts <- df %>% 
  group_by(group) %>% 
  count()

  group     n
  <chr> <int>
1 a        24
2 b        28
3 c        16
4 d        32

推荐阅读