R语言complete函数参数顺序及缺失组合行填充方法咨询
tidyr::complete() 用法解答 核心参数规则
complete() 配合管道%>%使用时,不需要手动传入数据框对象,管道会自动把前一步的数据集作为函数的第一个输入参数。你需要在数据参数之后传入的,是所有需要做全值交叉组合的列名,直接写裸列名即可,不需要加引号。
你代码里写的complete(twodigit, smb, ...)列参数位置本身是正确的,没有传参错误。
当前代码未生成smb=4行的原因
complete() 默认只会对传入列中原始数据已经存在的取值生成交叉组合。你运行complete前的数据集里smb列只有1、2、3三个取值,自然不会自动生成smb=4的行,需要手动指定要覆盖的取值范围。
修正实现方案
你需要在complete里明确指定smb列的取值范围包含4,同时补全所有需要填充的列的默认值,后续再对累计值做对齐即可,参考代码如下:
smbthird<-smbsecond %>% dplyr::select(year,qtr,period,twodigit,codetitle,employment,twodigittotal,smb) %>% group_by(twodigit,smb) %>% summarise(employment = sum(employment), worksites = n(), .groups = 'drop_last')%>% mutate(total_twodigit = sum(employment), employment = cumsum(employment), worksites = cumsum(worksites)) %>% # 明确指定要补全的列取值,配置全量填充规则 complete( twodigit, smb = 1:4, # 手动指定smb覆盖1-4的所有取值,自动生成smb=4的组合 fill = list( employment = 0, worksites = 0, total_twodigit = 0 ) ) %>% group_by(twodigit) %>% # 补全行的累计值取组内最大值,匹配你需要的数值 mutate( total_twodigit = max(total_twodigit, na.rm = TRUE), employment = ifelse(smb == 4, max(employment, na.rm = TRUE), employment), worksites = ifelse(smb == 4, max(worksites, na.rm = TRUE), worksites), smbshare = employment / total_twodigit )
填充规则配置说明
fill参数接收命名列表,列表元素名要和数据框列名一一对应,元素值为该列用于填充新生成组合的默认值- 没有写入fill列表的列,补全生成的新行会默认赋值为
NA,需要后续单独处理 - 如果列的取值不是连续整数,比如存在跳号,可以直接手动传入取值向量,例如
smb = c(1,2,3,5)即可,不需要强制连续。
内容的提问来源于stack exchange,提问作者Tim Wilcox
相关产品推荐
相关产品推荐

