首页 > 解决方案 > 如何使用唯一 ID 使用循环代码构建子集

问题描述

我尝试在 data.frame 中编写带有 ID 的循环代码df。我现在所做的是构建另一个列表 dm,其中包含来自以下位置的唯一 ID df$ID

dm<-df %>% select(ID) %>% unique()
for (i in 1:length( dm$ID)){
   df_new<-df %>% filter(ID %in% dm$ID[i]) 
...

当前的代码可以做我需要的。但是我想知道是否有另一种方法可以在不构建 dm 的情况下做到这一点?我想按 df 中的每个 ID 构建子集。有什么建议吗?

标签: r

解决方案


而不是循环遍历unique'ID'和subseting,更快的选择是根据'ID'的值将data.framesplit拆分data.framelistunique

df_list <- split(df, df$ID)     

从这里,我们可以使用lapplyfor循环

pdf(paste0(out_dir, output_date,'.pdf')) 
for(i in seq_along(df_list)) {
     ggplot(data = df_list[[i]]) + 
           ...
    } 
dev.off()

或与lapply

pdf(paste0(out_dir, output_date,'.pdf'))    
lapply(df_list, function(dat) 
        ggplot(data = dat) + 
           ...
    )
dev.off()        

关于unique“ID”对象的创建,更好的选择是

for(un in unique(df$ID)) {
       df_new <- df %>%
                    filter(ID == un)
       ggplot(df_new) + 
           ...
  }      

推荐阅读