如何将列表向量列拼接为单个字符串列?R语言数据处理求助
问题:合并分组列表数据为分隔字符串
原始需求是按day分组,将每组的see字段合并为逗号/空格分隔的字符串,NA对应位置显示为空。尝试的代码如下:
tibble( day = c("Mo", "Tu","Tu", "We","Th","Fr","Fr","Fr"), see = c("cat", "cat", "dog", NA, "cat","cat","dog","bird" ) ) %>% nest(data = see) %>% mutate(see = paste0(data)) %>% select(-data)
但执行后see列返回的是列表的字符串化结果,不符合预期:
# A tibble: 5 × 2 day see <chr> <chr> 1 Mo "list(see = \"cat\")" 2 Tu "list(see = c(\"cat\", \"dog\"))" 3 We "list(see = NA)" 4 Th "list(see = \"cat\")" 5 Fr "list(see = c(\"cat\", \"dog\", \"bird\"))"
解决方案
问题出在paste0(data)直接把整个嵌套列表转为了字符串,需要遍历每个分组的列表,提取see值并处理NA后再拼接。可以用purrr::map_chr来实现:
library(tibble) library(dplyr) library(purrr) tibble( day = c("Mo", "Tu","Tu", "We","Th","Fr","Fr","Fr"), see = c("cat", "cat", "dog", NA, "cat","cat","dog","bird" ) ) %>% nest(data = see) %>% mutate( see = map_chr(data, ~{ # 提取see列并过滤NA vals <- .x$see[!is.na(.x$see)] # 如果过滤后为空则返回空字符串,否则用逗号分隔拼接 if(length(vals) == 0) "" else paste(vals, collapse = ", ") }) ) %>% select(-data)
执行后得到预期结果:
# A tibble: 5 × 2 day see <chr> <chr> 1 Mo cat 2 Tu cat, dog 3 We "" 4 Th cat 5 Fr cat, dog, bird
内容的提问来源于stack exchange,提问作者rdv
相关产品推荐
相关产品推荐

