You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何将R列NA值对应的D列内容拼接到前一非NA行D列

实现思路

核心是先给数据行打分组标签:每次R列出现非NA值时开启新分组,后续NA行归属到上一个非NA值所在分组,再按分组聚合拼接D列即可。

注意:你给出的预期输出存在手误,原示例中R=456对应D列值为jkl、R=789对应D列值为mno,两行后面都没有匹配的NA行,因此正确输出的D列第二、三个值应为jkl、mno。


方案1:tidyverse 实现(代码最简洁)

library(dplyr)
library(stringr)

# 示例数据
my_df <- data.frame("R" = c("123", NA, NA, "456", "789", "123", NA),
                    "D" = c("abc", "def", "ghi", "jkl", "mno", "aze", "aze"),
                    stringsAsFactors = FALSE)

my_result <- my_df %>%
  # 生成分组ID:R为非NA时计数+1
  mutate(group = cumsum(!is.na(R))) %>%
  # 按组聚合
  group_by(group) %>%
  summarise(
    R = na.omit(R)[1], # 取每组唯一的非NA R值
    D = str_c(D, collapse = "") # 拼接同组所有D列内容
  ) %>%
  ungroup() %>%
  select(-group) # 清理临时分组列

运行结果:

> my_result
# A tibble: 4 × 2
  R     D        
  <chr> <chr>    
1 123   abcdefghi
2 456   jkl      
3 789   mno      
4 123   azeaze  

方案2:基础R实现(无需加载第三方包)

# 示例数据
my_df <- data.frame("R" = c("123", NA, NA, "456", "789", "123", NA),
                    "D" = c("abc", "def", "ghi", "jkl", "mno", "aze", "aze"),
                    stringsAsFactors = FALSE)

# 生成分组ID
my_df$group <- cumsum(!is.na(my_df$R))
# 按组聚合拼接D列
my_result <- aggregate(
  D ~ group + R,
  data = my_df,
  FUN = function(x) paste(x, collapse = "")
)
# 清理多余列
my_result <- my_result[, c("R", "D")]

运行结果和方案1完全一致。


内容的提问来源于stack exchange,提问作者DataM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:24:03