如何在R中按条件填充重复值?附数据集与预期输出
解决R语言中按组填充空值的问题
嘿,我懂你作为R语言初学者的困惑——知道group_by的作用,但不知道怎么把组里的非空值复制填充到同组的空值里对吧?别担心,咱们一步步来搞定这个问题。
首先明确你的核心需求:针对Int.Index列,把每个Name组里的空字符串("")替换成该组内的非空值。
步骤拆解
- 转换空字符串为缺失值:R里的填充函数只识别
NA,所以先把Int.Index里的""转换成标准缺失值NA; - 按分组字段聚合:用
group_by(Name)把数据按姓名分组; - 填充缺失值:用填充函数把组内的非空值同步到同组的空值位置。
代码实现
我们用dplyr(你熟悉的group_by所在包)和同属tidyverse家族的tidyr来完成操作,代码清晰易懂:
# 加载所需包 library(dplyr) library(tidyr) # 构造你的原始数据集 df <- tibble( Int.Index = c("340", "", "", "450", "5694", ""), Int.Line = c(1, 2, 3, 1, 1, 2), Name = c("John", "John", "John", "May", "Paul", "Paul"), Index = c(440, 440, 400, 500, 6023, 6023), Index.Line = c(1, 2, 3, 1, 1, 2), Amount = c(700, 100, 50, 2401, 1312, 7244) ) # 执行空值填充操作 df_filled <- df %>% # 把空字符串转为NA mutate(Int.Index = ifelse(Int.Index == "", NA, Int.Index)) %>% # 按Name分组 group_by(Name) %>% # 向下填充NA值,非空值会覆盖同组后续的空值 fill(Int.Index, .direction = "down") %>% # 取消分组状态 ungroup() # 查看最终结果 print(df_filled)
输出结果
运行代码后,就能得到你期望的数据集:
# A tibble: 6 × 6 Int.Index Int.Line Name Index Index.Line Amount <chr> <dbl> <chr> <dbl> <dbl> <dbl> 1 340 1 John 440 1 700 2 340 2 John 440 2 100 3 340 3 John 400 3 50 4 450 1 May 500 1 2401 5 5694 1 Paul 6023 1 1312 6 5694 2 Paul 6023 2 7244
额外小贴士
- 如果你的
Int.Index原本是数值型,最后可以用mutate(Int.Index = as.numeric(Int.Index))把它转回数值格式; - 如果组内的非空值在末尾而非开头,把
fill函数的.direction参数改成"up"即可实现向上填充。
内容的提问来源于stack exchange,提问作者GeanLoeson
相关产品推荐
相关产品推荐

