R语言:如何拆分数据框中长度不一的borders列?
我来帮你解决这个问题!你遇到的问题是因为直接用do.call(rbind, strsplit(...))会丢失原表的其他列,而且没有把拆分后的结果和原数据关联起来。下面是几种可行的解决方案,都能保留cca2、ccn3、cca3列,同时把borders列拆分成多列:
首先,先构造可重现的原始数据框(方便你测试):
countries <- data.frame( cca2 = c("AX", NA, "AD", "AT", "BE"), ccn3 = c(248, 8, 20, 40, 56), cca3 = c("ALA", "ALB", "AND", "AUT", "BEL"), borders = c("AL", "MNE,GRC,MKD,UNK", "FRA,ESP", "CZE,DEU,HUN,ITA,LIE,SVK,SVN,CHE", "FRA,DEU,LUX,NLD"), stringsAsFactors = FALSE )
方法1:使用tidyr的separate_wider_delim(推荐,简洁的tidyverse风格)
这个函数专门处理分隔列拆分的场景,自动处理长度不一致的情况,不足的位置填充NA,同时完美保留原表的其他列:
library(tidyr) newCountries <- countries %>% separate_wider_delim(borders, delim = ",", names_sep = "_")
执行后会生成borders_1、borders_2……直到最长的borders元素对应的列数,所有短于这个长度的行都会在后续列填充NA。
方法2:基础R改进版(无需额外依赖包)
如果不想引入tidyverse包,可以用基础R实现:先拆分borders得到列表,再把列表转成统一长度的数据框,最后和原表的核心列合并:
# 拆分borders列得到列表 borders_list <- strsplit(as.character(countries$borders), ",", fixed = TRUE) # 确定最长的borders元素长度,用来设置列数 max_border_len <- max(sapply(borders_list, length)) # 把每个列表元素补全到max_border_len长度,不足的填NA borders_df <- do.call(rbind, lapply(borders_list, function(x) { c(x, rep(NA, max_border_len - length(x))) })) # 给拆分后的列命名 colnames(borders_df) <- paste0("borders_", 1:max_border_len) # 合并原表的核心列和拆分后的borders列 newCountries <- cbind(countries[, c("cca2", "ccn3", "cca3")], borders_df)
方法3:使用data.table(适合大数据量场景)
如果你的数据量很大,data.table的操作会更高效:
library(data.table) setDT(countries) newCountries <- countries[, borders_split := strsplit(borders, ",", fixed = TRUE)][ , (paste0("borders_", 1:max(sapply(borders_split, length)))) := transpose(borders_split)][ , c("borders", "borders_split") := NULL]
以上三种方法都能满足你的需求,根据自己的使用习惯选择即可。
内容的提问来源于stack exchange,提问作者user9737581
相关产品推荐
相关产品推荐

