R语言如何按assembly变量更新winner及party列的信息
R按assembly分组填充winner与party列的实现方案
需求说明
按assembly列分组,每组内沿用第一个非0的winner、party值向下填充,组内无有效非0值的位置保持为0,匹配给出的df_output格式。
winner列填充实现
首先需要加载dplyr和tidyr两个依赖包:
library(dplyr) library(tidyr)
实现代码:
df_output <- df_input %>% # 将0替换为NA,方便填充函数识别待补全位置 mutate(winner = ifelse(winner == 0, NA_integer_, winner)) %>% # 按assembly分组 group_by(assembly) %>% # 向下填充非空值 fill(winner, .direction = "down") %>% ungroup() %>% # 组内无有效初始值的位置(剩余NA)替换回0 replace_na(list(winner = 0))
party列填充报错修复
报错原因
你的代码存在3个语法/逻辑错误:
- dplyr管道操作中引用列无需加数据框前缀
df_input$,直接写列名即可,前缀会导致语法解析失败,是本次报错的直接诱因 - 字符串类型的party列不能赋值为数值型的
NA_real_,会出现类型不匹配问题,应该用字符型空值NA_character_ - 你当前的逻辑是判断非NA值保留,但实际需要先把列中的0转换为空值才能触发填充逻辑
正确代码(可同时处理两列)
df_output <- df_input %>% mutate( # 处理数值型winner列 winner = ifelse(winner == 0, NA_integer_, winner), # 处理字符型party列,注意列中的0为字符串格式 party = ifelse(party == "0", NA_character_, party) ) %>% group_by(assembly) %>% # 同时向下填充两列 fill(winner, party, .direction = "down") %>% ungroup() %>% # 剩余空值统一替换回0 replace_na(list(winner = 0, party = "0"))
运行上述代码得到的结果与你给出的df_output完全一致。
内容的提问来源于stack exchange,提问作者Fuser
相关产品推荐
相关产品推荐

