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

合并含重复类别与NA值的非数值型DataFrame

处理非数值型DataFrame的类别合并问题

问题背景

我有一个包含类别列与多列非数值型值的DataFrame,类别列每个类别重复3次,需要将每个类别合并为一行并合并对应列的值。其中category3因特殊值会引入NA,可暂时移除后手动添加,最终需保留类别列以便后续与数值型数据表合并。

原始数据

Df <- data.frame(A = c("category1", "category1", "category1", 
                       "category2", "category2", "category2",
                       "category3", "category3", "category3"),
                 B = c("NA", "NA", "a",
                       "NA", "b", "NA",
                       "NA", "NA", "a"),
                 C = c("b", "NA", "NA", 
                       "a", "NA", "NA",
                       "b", "NA", "NA"),
                 D = c("NA", "ab", "NA", 
                       "NA", "NA", "ab",
                       "NA", "NA", "NA"),
                 E = c("NA", "NA", "NA", 
                        "NA", "NA", "NA",
                        "NA", "c", "NA"))

此前尝试的问题

之前用以下代码处理数值型数据有效,但处理非数值型列时仅保留单个值:

data1 <- data %>%
  group_by(category) %>%
  summarize_all(list(~toString(unique(.))))

解决方案

核心思路

你的数据里的"NA"是字符串类型而非R原生的缺失值NA,所以需要先过滤掉这些字符串,再按类别分组提取有效内容合并。对于特殊的category3,先单独移除处理,之后手动添加。

代码实现

library(dplyr)

# 先处理除category3外的部分
processed_data <- Df %>%
  filter(A != "category3") %>%
  group_by(A) %>%
  # 遍历B到E列,过滤掉"NA"字符串,取唯一值后拼接
  summarize(across(B:E, ~paste(unique(.[. != "NA"]), collapse = ", ")))

# 手动构造category3的行(根据实际需求调整值)
category3_entry <- data.frame(
  A = "category3",
  B = "a",
  C = "b",
  D = "",
  E = "c"
)

# 合并得到最终结果
final_data <- bind_rows(processed_data, category3_entry)

# 查看结果
print(final_data)

执行结果

运行后会得到每个类别一行的DataFrame:

A B C  D E
1 category1 a b ab  
2 category2 b a ab  
3 category3 a b    c

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:25:34