假设我有一个字符串数组,如:
sa<-c("HLA:HLA00001 A*01:01:01:01 1098 bp",
"HLA:HLA01244 A*01:01:02 546 bp",
"HLA:HLA01971 A*01:01:03 895 bp")
Run Code Online (Sandbox Code Playgroud)
我的问题是将它转换为数据框的最佳方法是什么,例如:
Seq Type Length
1 HLA:HLA00001 A*01:01:01:01 1098 bp
2 HLA:HLA01244 A*01:01:02 546 bp
3 HLA:HLA01971 A*01:01:03 895 bp
Run Code Online (Sandbox Code Playgroud)
data_frame,separate 列:data_frame(sa) %>%
separate(sa, c('Seq', 'Type', 'Length'), sep = ' ', extra = 'drop', convert = TRUE)
Run Code Online (Sandbox Code Playgroud)
Source: local data frame [3 x 3]
Seq Type Length
(chr) (chr) (int)
1 HLA:HLA00001 A*01:01:01:01 1098
2 HLA:HLA01244 A*01:01:02 546
3 HLA:HLA01971 A*01:01:03 895
Run Code Online (Sandbox Code Playgroud)
这(有意)将单元从最后一列中删除,该列现在是冗余的(因为它总是相同的),并将其转换为整数.如果你想保留它,请extra = 'merge'改用.
您可以Type通过另一个<tidyr>函数的应用程序进一步分隔该列,非常类似于separate,但指定要匹配的部分:extract.此函数允许您提供正则表达式(必须学习的工具,如果您还不知道它!),它指定要匹配的文本部分.这些部分在括号中:
'(A\\*\\d{2}:\\d{2}):(.*)'
Run Code Online (Sandbox Code Playgroud)
这意味着:提取两个组 - 第一组包含字符串" A*",后跟两个数字," :"和另外两个数字.第二组包含所有其余文本,分离后" :"(我希望我已经正确地捕获了HLA等位基因的规范,我从未使用过这种类型的数据).
与上面的代码放在一起:
data_frame(sa) %>%
separate(sa, c('Seq', 'Type', 'Length'), sep = ' ', extra = 'drop', convert = TRUE) %>%
extract(Type, c('Group', 'Allele'), regex = '(A\\*\\d{2}:\\d{2}):(.*)')
Run Code Online (Sandbox Code Playgroud)
Source: local data frame [3 x 4]
Seq Group Allele Length
(chr) (chr) (chr) (int)
1 HLA:HLA00001 A*01:01 01:01 1098
2 HLA:HLA01244 A*01:01 02 546
3 HLA:HLA01971 A*01:01 03 895
Run Code Online (Sandbox Code Playgroud)