如何基于House列拆分R语言data.frame并新增序号列?
处理R语言data.frame中House列的多值拆分需求
可以用两种方式实现你的需求,分别是基于tidyverse工具包的简洁写法,以及无需额外包的base R写法:
方法一:使用tidyverse(推荐)
tidyverse里的separate_rows函数可以直接拆分多值列,搭配分组操作生成对应的head标签:
# 安装并加载tidyverse(首次使用需安装) # install.packages("tidyverse") library(tidyverse) # 你的原始数据 df <- data.frame(Region = c("AU","USA","CA","UK","GE","AU","USA","CA","UK"), lock = c(1,1,NA,1,NA,1,NA,1,NA), type= c("sale",NA,NA,"target","target",NA,"sale",NA,"target"), House =c("Tagore house","Gandhi house",NA,"Flexible;Tagore house;Gandhi house","Tagore house",NA,"Flexible;Gandhi house","Gandhi house","Gandhi house")) # 核心处理代码 df_processed <- df %>% mutate(row_id = row_number()) %>% # 给原数据每行加唯一标识,用于后续分组 separate_rows(House, sep = ";") %>% # 按;拆分House列,拆分后每行对应一个值 group_by(row_id) %>% # 按原行分组,确保同一原行拆分出的行属于一组 mutate(head_label = paste0("head", row_number())) %>% # 生成head1、head2...的标签 ungroup() %>% # 取消分组 select(-row_id) # 移除临时的行号列(不需要可删除此行) # 查看处理后的结果 print(df_processed)
方法二:使用base R(无需额外包)
如果你不想加载第三方包,用base R的字符串拆分和行扩展也能实现:
# 你的原始数据 df <- data.frame(Region = c("AU","USA","CA","UK","GE","AU","USA","CA","UK"), lock = c(1,1,NA,1,NA,1,NA,1,NA), type= c("sale",NA,NA,"target","target",NA,"sale",NA,"target"), House =c("Tagore house","Gandhi house",NA,"Flexible;Tagore house;Gandhi house","Tagore house",NA,"Flexible;Gandhi house","Gandhi house","Gandhi house")) # 拆分House列得到每个元素的列表 split_house <- strsplit(df$House, ";") # 扩展原数据的行,对应拆分后的元素数量 expanded_df <- df[rep(seq_len(nrow(df)), sapply(split_house, length)), ] # 替换House列为拆分后的单个值 expanded_df$House <- unlist(split_house) # 生成head标签列 expanded_df$head_label <- unlist(lapply(split_house, function(x) paste0("head", seq_along(x)))) # 查看结果 print(expanded_df)
两种方法都会保留原数据中的NA行,拆分后的行自动继承原行的其他列值,同时新增head_label列标注序号。
内容的提问来源于stack exchange,提问作者potro
相关产品推荐
相关产品推荐

