为何str_split_fixed()未生成新列?问题排查与解决
拆分列后出现矩阵列的原因及解决方法
问题重现
原始数据集
> data_short Symbol_ID GFP_Mean GFP_SD Cells <chr> <dbl> <dbl> <dbl> 1 Control_0 0.0303 0.00657 7071. 2 XRCC4_7518 0.0396 0.00768 5022 3 XRCC5_7520 0.0305 0.00629 5781. 4 BRCA1_672 0.0178 0.00833 1822. 5 DDX48_9775 0.109 0.0201 239 6 HMGN1_3150 0.0997 0.00875 1173 7 PRDM13_59336 0.0789 0.00794 980 8 UBOX5_22888 0.0734 0.00653 1378 9 HIST1H2AE_3012 0.0719 0.00592 1906 10 HMGN2_3151 0.0691 0.00934 738
执行的拆分代码
data_short<-data_short %>% mutate(Symbol_ID=str_split_fixed(data_short$Symbol_ID, "_", 2))
表面的拆分结果
Symbol_ID[,1] [,2] GFP_Mean GFP_SD Cells <chr> <chr> <dbl> <dbl> <dbl> 1 Control 0 0.0303 0.00657 7071. 2 XRCC4 7518 0.0396 0.00768 5022 3 XRCC5 7520 0.0305 0.00629 5781. 4 BRCA1 672 0.0178 0.00833 1822. 5 DDX48 9775 0.109 0.0201 239 6 HMGN1 3150 0.0997 0.00875 1173 7 PRDM13 59336 0.0789 0.00794 980 8 UBOX5 22888 0.0734 0.00653 1378 9 HIST1H2AE 3012 0.0719 0.00592 1906 10 HMGN2 3151 0.0691 0.00934 738
实际结构异常(str()输出)
> str(data_short) tibble [1,177 × 4] (S3: tbl_df/tbl/data.frame) $ Symbol_ID: chr [1:1177, 1:2] "Control" "XRCC4" "XRCC5" "BRCA1" ... $ GFP_Mean : num [1:1177] 0.0303 0.0396 0.0305 0.0178 0.1088 ... $ GFP_SD : num [1:1177] 0.00657 0.00768 0.00629 0.00833 0.02014 ... $ Cells : num [1:1177] 7071 5022 5781 1822 239 ...
原因分析
str_split_fixed()函数返回的是矩阵类型,而非独立的列。你直接将这个矩阵赋值给原列Symbol_ID,导致该列变成了嵌套在tibble中的矩阵。虽然打印时视觉上像两列,但本质是单个矩阵列,因此str()会显示矩阵的维度信息chr [1:1177, 1:2]。
解决方法
方法1:使用separate()(tidyr包,推荐)
这是拆分列最简洁直观的方式,直接指定拆分规则和新列名:
library(tidyr) data_short <- data_short %>% separate(Symbol_ID, into = c("Symbol", "ID"), sep = "_")
执行后,原Symbol_ID列会被替换为Symbol和ID两个独立的字符列,用str()查看即可看到正常的单列结构。
方法2:正确处理str_split_fixed()的结果
若坚持使用stringr包的str_split_fixed(),需提取矩阵的每一列作为新列:
library(stringr) data_short <- data_short %>% mutate( Symbol = str_split_fixed(Symbol_ID, "_", 2)[, 1], ID = str_split_fixed(Symbol_ID, "_", 2)[, 2], .keep = "unused" # 可选:移除原Symbol_ID列,保持数据整洁 )
通过索引[,1]和[,2]提取矩阵的两列,生成独立的新列,.keep = "unused"可自动删除原列。
内容的提问来源于stack exchange,提问作者Chemokine1
相关产品推荐
相关产品推荐

