简化数据重复的框架名称和变量名称

问题描述 投票:0回答:1

我正在使用 12 个数据集的数据创建一个数据框:pbp_2020_novbid、pbp_2020_vbid_nodup、pbp_2020_total、pbp_2021_novbid、pbp_2021_vbid_nodup、pbp_2021_total、...、pbp_2023_novbid、pbp_2023_vbid_nodup、 bp_2023_total

它们是2020-2023年的数据,有3种类型:novbid、vbid_nodup、total。数据集名称重复,我想知道如何使代码更简洁?也许创建一个函数?

Year <- c(rep(2020:2023, each=3))

VBID <- c(rep(0:2, time=4))

Total_plan_number <- c(length(unique(pbp_2020_novbid$bid_id)), length(unique(pbp_2020_vbid_nodup$bid_id)), length(unique(pbp_2020_total$bid_id)),length(unique(pbp_2021_novbid$bid_id)), length(unique(pbp_2021_vbid_nodup$bid_id)), length(unique(pbp_2021_total$bid_id)),length(unique(pbp_2022_novbid$bid_id)), length(unique(pbp_2022_vbid_nodup$bid_id)), length(unique(pbp_2022_total$bid_id)),length(unique(pbp_2023_novbid$bid_id)), length(unique(pbp_2023_vbid_nodup$bid_id)), length(unique(pbp_2023_total$bid_id)))
df <- data.frame(Year, VBID, Total_plan_number)
r
1个回答
0
投票

正如评论所建议的,您可以将所有这些数据帧转储到列表中,然后迭代它们。但是,您现有的设置也可以进行如下调整:

library(dplyr)

data.frame(Year, VBID) %>%
  mutate(
    Total_plan_number = sapply(
      paste("pbp", Year, VBID, sep = "_"),
      function(name) {
        length(unique(get(name)$bid_id))
      }
    )
  )

这就是它的作用:

  1. 使用
    paste()
    然后生成每个数据框的名称
  2. 使用
    sapply()
  3. 迭代名称
  4. 对于每个名称,使用
    get()
  5. 检索相应的数据框
  6. bid_id
    列中删除重复项并进行计数。

这是使用一些测试数据的结果:

   Year       VBID Total_plan_number
1  2020     novbid                 5
2  2020 vbid_nodup                 7
3  2020      total                 5
4  2021     novbid                 9
5  2021 vbid_nodup                 5
6  2021      total                11
7  2022     novbid                13
8  2022 vbid_nodup                 3
9  2022      total                 5
10 2023     novbid                12
11 2023 vbid_nodup                 9
12 2023      total                 5
© www.soinside.com 2019 - 2024. All rights reserved.