在R的tidyverse中按非NA的words对应汇总Duration列的问题
解决tidyverse中按非NA列对应拼接另一列的问题
问题分析
你遇到的问题是在summarise中尝试筛选words非NA对应的Duration值拼接时,意外拼接了所有Duration值。大概率是因为当前tidyverse上下文里,逻辑索引!is.na(words)没有正确作用于Duration列(比如words列的NA是字符串"NA"而非真正的缺失值,或者索引逻辑在summarise中被意外解析)。
正确解决方案
以下几种方法都能实现需求,且无需提前过滤数据框(保留其他列的汇总能力):
方法1:明确提取非NA对应的向量
用which()将逻辑向量转换为位置索引,避免潜在的上下文解析问题:
library(tidyverse) df %>% summarise( words = str_c(words[!is.na(words)], collapse = ","), words_dur = str_c(Duration[which(!is.na(words))], collapse = ",") )
方法2:用filter配合pull明确筛选
直接基于words非NA的行提取Duration,逻辑更直观:
library(tidyverse) df %>% summarise( words = str_c(na.omit(words), collapse = ","), words_dur = str_c(pull(filter(df, !is.na(words)), Duration), collapse = ",") )
方法3:用purrr::keep筛选
借助purrr工具包的keep函数,按words的非NA状态保留对应Duration值:
library(tidyverse) df %>% summarise( words = str_c(na.omit(words), collapse = ","), words_dur = str_c(keep(Duration, !is.na(words)), collapse = ",") )
验证结果
运行上述任意代码,针对你的示例数据都会得到期望输出:
words words_dur 1 hey,how,are,you 44,55,77,99
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

