You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分分隔字符串为新行并保留原列?(dplyr/tidyr示例)

拆分多值列同时保留原始列的简便方法

原始数据

# 构造示例数据
df1 <- data.frame("SNP" = c("rs11807834", "rs3729986"),
                  "Symbols" = c("GRIN1,SETD1A", "MADD,STAC3,SPI1"))

输出结果:

SNP         Symbols
1 rs11807834    GRIN1,SETD1A
2  rs3729986 MADD,STAC3,SPI1

使用separate_rows拆分的问题

用tidyr::separate_rows拆分Symbols列的多值内容后,原始的多基因组合列会被替换成拆分后的单个基因值,原始列直接消失:

df1 %>% 
  separate_rows(Symbols, sep = ",") 

输出结果:

# # A tibble: 5 x 2
#   SNP        Symbols
#   <chr>      <chr>  
# 1 rs11807834 GRIN1  
# 2 rs11807834 SETD1A 
# 3 rs3729986  MADD   
# 4 rs3729986  STAC3  
# 5 rs3729986  SPI1 

现有保留原始列的方法

目前有两种常规方式可以保留原始的多基因组合列:

  • 方法一:左连接原始数据
df1 %>% 
  separate_rows(Symbols, sep = ",") %>% 
  left_join(df1, by = "SNP")

输出结果:

# # A tibble: 5 x 3
#   SNP        Symbols.x Symbols.y      
#   <chr>      <chr>     <chr>          
# 1 rs11807834 GRIN1     GRIN1,SETD1A   
# 2 rs11807834 SETD1A    GRIN1,SETD1A   
# 3 rs3729986  MADD      MADD,STAC3,SPI1
# 4 rs3729986  STAC3     MADD,STAC3,SPI1
# 5 rs3729986  SPI1      MADD,STAC3,SPI1
  • 方法二:分组拼接复原原始列
df1 %>% 
  separate_rows(Symbols, sep = ",") %>% 
  group_by(SNP) %>% 
  mutate(Genes = paste(Symbols, collapse = ",")) %>% 
  ungroup()

输出结果:

#  # A tibble: 5 x 3
#   SNP        Symbols Genes          
#   <chr>      <chr>   <chr>          
# 1 rs11807834 GRIN1   GRIN1,SETD1A   
# 2 rs11807834 SETD1A  GRIN1,SETD1A   
# 3 rs3729986  MADD    MADD,STAC3,SPI1
# 4 rs3729986  STAC3   MADD,STAC3,SPI1
# 5 rs3729986  SPI1    MADD,STAC3,SPI1

更简便的实现方式

有没有更直接的方法?比如想象中给separate_rows加个keep=TRUE参数(但该参数实际不存在):

# 该写法仅为示例,实际无此参数
df1 %>% 
  separate_rows(Symbols, sep = ",", keep = TRUE)

其实最简便的方式是拆分前先复制原始列,这样拆分后原始列依然保留:

df1 %>% 
  mutate(Original_Symbols = Symbols) %>% 
  separate_rows(Symbols, sep = ",")

输出结果:

# # A tibble: 5 x 3
#   SNP        Symbols Original_Symbols
#   <chr>      <chr>   <chr>            
# 1 rs11807834 GRIN1   GRIN1,SETD1A     
# 2 rs11807834 SETD1A  GRIN1,SETD1A     
# 3 rs3729986  MADD    MADD,STAC3,SPI1  
# 4 rs3729986  STAC3   MADD,STAC3,SPI1  
# 5 rs3729986  SPI1    MADD,STAC3,SPI1  

另外也可以用tidyr::separate_wider_delim结合unnest_longer实现,步骤稍多但也可行:

df1 %>%
  separate_wider_delim(Symbols, delim = ",", names_sep = "_", too_few = "align_start") %>%
  pivot_longer(cols = starts_with("Symbols"), values_drop_na = TRUE, names_to = NULL) %>%
  rename(Symbols = value)

内容的提问来源于stack exchange,提问作者zx8754

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:30:45