如何按STAND分组截取数据框前182行,统一各组行数?
需求说明
对数据框ds按STAND字段分组,截取每组的前182行数据,使所有分组行数统一为182行;对于行数超过182的分组(如GUABIJU_017B、GUAJUVIRAII_002A等),直接丢弃多余行。
当前数据分组行数情况
加载数据后,通过table(ds$STAND)可查看部分分组行数超标:
# 加载包 library(dplyr) # 读取数据 ds <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/my_ts_data.csv") table(ds$STAND) # ALCINA_001A ALDOSANI_031A AROEIRAB_017A ARROIOXAVIER_012A ARROIOXAVIER_027B # 182 182 182 182 182 # AZAMBUJAI_001A AZAMBUJAI_018A BARBANEGRA_404F BARRONDAO_026A BOAVISTA_019A # 182 182 182 364 182 # BOMRECREIO_010A CAMBARA_014A CANAFISTULA_046A CERRODACRUZ_013D CHACARA_002A # 182 182 2548 182 182 # CORDILHEIRA_004B COXILHADOROSA_006B CUENTRILHOI_019D CUENTRILHOI_028A CUENTRILHOI_040A # 182 182 182 182 182 # DOISIRMAOS_001A ESTRADAREALI_006A FIGUEIRAS_012A FOLLES_002A FOLLES_011A # 182 182 546 182 182 # GRAXAIM_002A GUABIJU_007C GUABIJU_010C GUABIJU_011B GUABIJU_016B # 182 182 182 182 182 # GUABIJU_017B GUAJUVIRAII_002A MONTECASTELO_035A MONTECASTELO_050B PANTERANEGRA_006F # 364 728 182 182 182 # PARAISO_035D PARAISO_041A PARAISOII_029A PASSODAESTANCIA_002A PINHEIROS_040A # 182 182 364 182 182 # PONTADASCANAS_021D QUITERIA_225A RAMOS_003B RAMOS_014A RANCHOVELHO_004A # 182 182 182 182 182 # RINCAODOSSOARES_004A RINCAODOSSOARES_005D RINCAODOSSOARES_015E SANTAROSAI_026A SAOBRAS_004B # 182 364 546 182 182 # SAOJOAO_004A SONHOMEU_004A TAQUAREMBO_003F TAQUAREMBOII_002A TERRADURA_033B # 182 182 182 182 182 # VACACAI_009D VENDAVELHA_014B VILAPALMA_012B VILAPALMA_025A VILAPALMA_026A # 182 182 182 182 182 # VILAPALMA_030A VILAPALMA_030C VILAPALMA_033C VILAPALMA_033K # 182 182 182 182
期望输出
所有STAND分组行数均为182:
table(ds$STAND) # ALCINA_001A ALDOSANI_031A AROEIRAB_017A ARROIOXAVIER_012A ARROIOXAVIER_027B # 182 182 182 182 182 # AZAMBUJAI_001A AZAMBUJAI_018A BARBANEGRA_404F BARRONDAO_026A BOAVISTA_019A # 182 182 182 182 182 # BOMRECREIO_010A CAMBARA_014A CANAFISTULA_046A CERRODACRUZ_013D CHACARA_002A # 182 182 182 182 182 # CORDILHEIRA_004B COXILHADOROSA_006B CUENTRILHOI_019D CUENTRILHOI_028A CUENTRILHOI_040A # 182 182 182 182 182 # DOISIRMAOS_001A ESTRADAREALI_006A FIGUEIRAS_012A FOLLES_002A FOLLES_011A # 182 182 182 182 182 # GRAXAIM_002A GUABIJU_007C GUABIJU_010C GUABIJU_011B GUABIJU_016B # 182 182 182 182 182 # GUABIJU_017B GUAJUVIRAII_002A MONTECASTELO_035A MONTECASTELO_050B PANTERANEGRA_006F # 182 182 182 182 182 # PARAISO_035D PARAISO_041A PARAISOII_029A PASSODAESTANCIA_002A PINHEIROS_040A # 182 182 182 182 182 # PONTADASCANAS_021D QUITERIA_225A RAMOS_003B RAMOS_014A RANCHOVELHO_004A # 182 182 182 182 182 # RINCAODOSSOARES_004A RINCAODOSSOARES_005D RINCAODOSSOARES_015E SANTAROSAI_026A SAOBRAS_004B # 182 182 182 182 182 # SAOJOAO_004A SONHOMEU_004A TAQUAREMBO_003F TAQUAREMBOII_002A TERRADURA_033B # 182 182 182 182 182 # VACACAI_009D VENDAVELHA_014B VILAPALMA_012B VILAPALMA_025A VILAPALMA_026A # 182 182 182 182 182 # VILAPALMA_030A VILAPALMA_030C VILAPALMA_033C VILAPALMA_033K # 182 182 182 182
解决方案
使用dplyr的分组与行截取函数即可实现需求,以下两种方法任选其一:
方法1:使用slice_head()(直观指定截取行数)
library(dplyr) # 读取数据 ds <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/my_ts_data.csv") # 分组后截取每组前182行 ds_trimmed <- ds %>% group_by(STAND) %>% slice_head(n = 182) %>% ungroup() # 验证结果 table(ds_trimmed$STAND)
方法2:使用slice()(指定行索引范围)
ds_trimmed <- ds %>% group_by(STAND) %>% slice(1:182) %>% ungroup() # 验证结果 table(ds_trimmed$STAND)
两种方法均能将所有STAND分组的行数统一为182行,自动丢弃分组内多余的行。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

