如何将含分号分隔账单的DataFrame转换为长格式?
拆分分号分隔的账单列并转换为长格式数据
你的原始数据如下:
id <- c("673506", "624401", "674764") bills <- c("sb 1181; ab 573; ab 2697", "sb 1181; ab 573; ab 2697; ab 2448", "sb 292; ab 497") df <- data.frame(id, bills)
方法一:使用tidyverse包(推荐,代码简洁)
tidyverse里的separate_rows()函数可以直接将分号分隔的字符串拆分成多行,同时保留对应的id:
# 如果没安装tidyverse先安装 # install.packages("tidyverse") library(tidyverse) # 拆分并转换为长格式 long_df <- df %>% separate_rows(bills, sep = "; ") # 查看结果 long_df
运行后得到的目标结果:
id bills 1 673506 sb 1181 2 673506 ab 573 3 673506 ab 2697 4 624401 sb 1181 5 624401 ab 573 6 624401 ab 2697 7 624401 ab 2448 8 674764 sb 292 9 674764 ab 497
方法二:使用Base R(无需额外安装包)
如果不想加载第三方包,可以用基础R的函数组合实现:
# 拆分bills列的字符串为列表 split_bills <- strsplit(df$bills, "; ") # 构造长格式数据框:重复对应id,展开拆分后的账单 long_df_base <- data.frame( id = rep(df$id, sapply(split_bills, length)), bills = unlist(split_bills) ) # 查看结果 long_df_base
这个方法的逻辑是先拆分每个账单字符串,再根据每个拆分结果的长度重复对应id,最后将拆分后的账单列表展开为列,结果和方法一完全一致。
内容的提问来源于stack exchange,提问作者Sharif Amlani
相关产品推荐
相关产品推荐

