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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:21:58