将字符串数组转换为R中的数据帧

Dav*_*d Z 2 r dataframe

假设我有一个字符串数组,如:

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)

Kon*_*lph 5

使用<dplyr><tidyr>包,这是微不足道的:

  1. 将数据放入data_frame,
  2. 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)