R语言separate函数拆分列异常求助:将A1A2列拆分为A1、A2列时A2列出现NA值的问题
问题分析与解决方案
嘿,我来帮你搞定这个列拆分的问题~
为什么会出现A2全为NA的情况?
separate()函数默认是**按照非字母数字的分隔符(比如逗号、空格、横杠等)**来拆分列的,但你的A1A2列里的字符是紧紧连在一起的(比如AG、TC这种没有任何分隔符的双字符),所以函数只会把第一个字符提取到A1,剩下的内容找不到预设的分隔符,就会被识别为缺失值(NA)啦。
解决方法:指定拆分规则
这里有几种简单有效的修改方式,都能实现你想要的效果:
方法1:用sep参数指定拆分位置
因为你的A1A2列每个值都是固定2个字符,直接指定从第1个字符后面拆分就行:
merged3 <- merged2 %>% separate(A1A2, c("A1", "A2"), sep = 1)
方法2:用str_sub()提取固定位置字符
这种方式更直观,直接提取每个字符串的第1位和第2位:
library(stringr) # 如果没加载的话先加载这个包 merged3 <- merged2 %>% mutate(A1 = str_sub(A1A2, start = 1, end = 1), A2 = str_sub(A1A2, start = 2, end = 2)) %>% select(-A1A2) # 可选步骤:删除原来的A1A2列
方法3:用extract()配合正则表达式
用正则匹配每个单个字符,把它们分别捕获到A1和A2列:
merged3 <- merged2 %>% extract(A1A2, c("A1", "A2"), "(.)(.)")
验证结果
不管用哪种方法,运行后你都会得到预期的结果:
SNP A1 A2 P
1:12321 A G 3
2:1231232 T C 12
8:1231321 G G 13
内容的提问来源于stack exchange,提问作者D. Fowler
相关产品推荐
相关产品推荐

