如何通过group_by()正确合并R数据框的行?
按Name合并R数据框行的正确方法
原始数据框
你使用的R数据框结构如下:
df <- structure(list(Name = c("Tom", "Tom", "Marry", "Ace"), ClassA = c("A","B", "A", "B"), ClassB = c("B", NA, NA, NA), ClassC = c(NA, "C","C", NA)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))
原代码的问题
你原本的代码直接用str_c拼接所有值,但未处理NA,导致出现空字符串或不符合预期的结果:
try<- df%>% group_by(Name) %>% summarise(across(everything(), str_c, collapse=""))%>% ungroup()
核心问题:str_c默认会保留NA(只要分组内有一个NA就返回NA),且直接拼接会把NA当作空内容处理,无法实现「保留非NA值,无有效值则留NA」的目标。
修改后的代码
下面是修正后的代码,重点处理NA值并按需求拼接:
library(dplyr) library(stringr) result <- df %>% group_by(Name) %>% summarise( across( everything(), ~ str_c(na.omit(.), collapse = ", ") %>% ifelse(. == "", NA, .) ), .groups = "drop" )
代码解释
na.omit(.):先移除当前分组列中的所有NA值str_c(..., collapse = ", "):将剩余的非NA值用「逗号+空格」拼接成字符串ifelse(. == "", NA, .):若分组后该列无有效非NA值(拼接结果为空字符串),则转为NA,匹配目标格式.groups = "drop":直接取消分组,等价于后续调用ungroup()
最终结果
运行上述代码后,得到的结果如下:
# A tibble: 3 × 4 Name ClassA ClassB ClassC <chr> <chr> <chr> <chr> 1 Ace B NA NA 2 Marry A NA C 3 Tom A, B B C
内容的提问来源于stack exchange,提问作者Stataq
相关产品推荐
相关产品推荐

