我正在使用 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)
正如评论所建议的,您可以将所有这些数据帧转储到列表中,然后迭代它们。但是,您现有的设置也可以进行如下调整:
library(dplyr)
data.frame(Year, VBID) %>%
mutate(
Total_plan_number = sapply(
paste("pbp", Year, VBID, sep = "_"),
function(name) {
length(unique(get(name)$bid_id))
}
)
)
这就是它的作用:
paste()
然后生成每个数据框的名称sapply()
和 get()
和 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