R语言求助:如何合并dataframe每行非NA值并统计绘图?
解决每行含NA的数据框变量值组合计数绘图问题
问题分析
你原来的代码中everything(!NA)是错误用法,everything()用于选择所有列,无法实现逐行筛选非NA值的需求,导致组合字符串生成不正确。由于每行都有NA,不能用na.omit删除整行,必须逐行保留非NA的变量值组合。
解决方案
方法1:保留变量名的组合(推荐,无歧义)
这种方式会把每行非NA的变量名和对应值配对后拼接,清晰区分不同变量的组合:
library(tidyverse) # 创建示例数据 df <- tibble( a = c(1, NA, NA, 5), b = c(2, 2, NA, 7), c = c(3, 4, NA, NA), d = c(NA, 5, 6, NA) ) # 逐行生成变量-值组合字符串 df <- df %>% rowwise() %>% mutate( combined = paste( str_c(names(.), ":", .)[!is.na(c_across(everything()))], collapse = "_" ) ) %>% ungroup() # 统计组合出现次数 count_data <- df %>% count(combined, sort = TRUE) # 绘制条形图 ggplot(count_data, aes(y = fct_reorder(combined, n), x = n)) + geom_bar(stat = "identity", fill = "#2c3e50") + labs( title = "每行变量值组合的计数分布", y = "变量值组合", x = "计数" ) + theme_minimal()
运行后,示例数据的combined列会生成:
- 第一行:
a:1_b:2_c:3 - 第二行:
b:2_c:4_d:5 - 第三行:
d:6 - 第四行:
a:5_b:7
方法2:仅保留非NA值拼接(存在歧义,谨慎使用)
如果不需要变量名,仅需拼接非NA值,可使用以下代码,但要注意:不同变量的相同值拼接会被误认为同一组合(比如a=1,b=2和b=1,c=2都会生成1_2):
df <- df %>% rowwise() %>% mutate( combined = paste(na.omit(c_across(everything())), collapse = "_") ) %>% ungroup() # 后续计数和绘图代码同方法1
关键说明
- 使用
rowwise()开启逐行处理模式,确保每行单独计算非NA内容 c_across(everything())提取当前行的所有值,配合!is.na()筛选非NA项str_c(names(.), ":", .)将变量名和值配对,避免组合歧义
内容的提问来源于stack exchange,提问作者mlp206
相关产品推荐
相关产品推荐

