在R语言中如何将3个字符串列合并为不含NA的列表列?
解决方案:合并多列为列表列并自动剔除NA值
基础R修改方案
直接自定义过滤NA的函数传入Map,替换原有的c函数即可:
df <- tibble::tribble( ~X, ~Y, ~R, "x1", "y1", "r1", "x2", "y2", "r2", "x3", "y3", NA, ) # 自定义函数:合并后过滤NA df$Z <- Map(function(x, y, r) { combined <- c(x, y, r) combined[!is.na(combined)] }, df$X, df$Y, df$R) # 验证结果 df$Z[3] # 输出:[[1]] "x3" "y3" class(df$Z) # [1] "list"
tidyverse方案(更简洁)
如果习惯用tidyverse工具链,推荐两种实现方式:
方法1:purrr::pmap
library(purrr) df$Z <- pmap(df[, c("X", "Y", "R")], ~ c(...) %>% discard(is.na))
方法2:dplyr rowwise + c_across
library(dplyr) df <- df %>% rowwise() %>% mutate(Z = list(c_across(X:R)[!is.na(c_across(X:R))])) %>% ungroup()
核心逻辑
所有方案的本质一致:按行合并多列值后,筛选掉其中的NA元素,确保列表列的每个元素只保留非空字符串。
内容的提问来源于stack exchange,提问作者Lulliter
相关产品推荐
相关产品推荐

