R语言处理多数据框:SiteName重复超50次时随机抽样实现方法
R代码实现方案
你可以根据自己的使用习惯选择以下两种实现方式:
方法1:tidyverse生态实现(代码简洁易维护,推荐)
需要先加载dplyr和purrr两个包:
# 加载依赖包 library(dplyr) library(purrr) # 定义单个数据框的处理函数 process_single_df <- function(df) { df %>% group_by(SiteName) %>% slice_sample(n = min(n(), 50)) %>% # 每组最多保留50行,不足50行则全留 ungroup() } # 遍历整个数据框列表完成处理 Visit.data_processed <- map(Visit.data_allyears, process_single_df)
方法2:base R实现(无需安装第三方包)
Visit.data_processed <- lapply(Visit.data_allyears, function(df) { # 按SiteName拆分分组 df_split <- split(df, df$SiteName) # 对每个分组处理 df_processed <- lapply(df_split, function(group_df) { n_row <- nrow(group_df) if (n_row > 50) { # 超过50行随机抽50行 group_df[sample(n_row, 50), ] } else { # 不足50行直接返回 group_df } }) # 合并所有分组为单个数据框 do.call(rbind, df_processed) })
补充说明
- 如果需要抽样结果可复现,可在运行代码前执行
set.seed(自定义数值),例如set.seed(123) - 以上代码默认执行无放回抽样,如果需要有放回抽样,可在
slice_sample(tidyverse方案)中添加replace = TRUE参数,或在base R方案的sample()函数中添加replace = TRUE参数
内容的提问来源于stack exchange,提问作者username97
相关产品推荐
相关产品推荐

