使用dplyr按行分组填充列的高效实现方法求助
使用dplyr高效填充分组内缺失值
问题场景
你有如下结构的数据集(示例已简化,实际包含更多行和列):
class section a NA b s1 c NA d NA a NA b s2 c NA d NA a NA b s3 c NA d NA
数据以每组a、b、c、d为一个分组,a始终在b之前,c、d始终在b之后。需要将每组中b对应的section值,填充到同组的a、c、d行的section列中,期望结果如下:
class section a s1 b s1 c s1 d s1 a s2 b s2 c s2 d s2 a s3 b s3 c s3 d s3
之前用for循环+if-else实现时,因数据量过大效率极低,希望用dplyr实现高效处理。
解决方案
通过生成分组标识+向量化填充的方式实现,具体代码如下:
library(dplyr) # 假设你的数据框名为df df <- df %>% # 生成分组ID:每遇到class为a时,开启新分组 mutate(group_id = cumsum(class == "a")) %>% # 按分组处理,提取每组b对应的section值填充整组 group_by(group_id) %>% mutate(section = section[class == "b"]) %>% # 取消分组并移除临时标识列(按需保留) ungroup() %>% select(-group_id)
代码说明
cumsum(class == "a"):利用class等于a时返回1的特性,累加后生成连续的分组ID,自动将每组a、b、c、d划为同一组。group_by(group_id):按生成的分组ID执行组内操作。section = section[class == "b"]:在每个分组内提取class为b对应的唯一有效section值,自动填充整组的section列,覆盖NA值。- 最后取消分组并移除临时的
group_id,得到目标结果。
该方法为向量化操作,相比循环效率提升显著,适合处理大数据量。
内容的提问来源于stack exchange,提问作者cookiemonster
相关产品推荐
相关产品推荐

