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
相关产品推荐
相关产品推荐

