如何拆分分隔字符串为新行并保留原列?(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
相关产品推荐
相关产品推荐

