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

时间:2016-06-23 18:22:34

标签: 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")

我的问题是将它转换为数据框的最佳方法是什么,例如:

  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

4 个答案:

答案 0 :(得分:5)

使用‹dplyr›‹tidyr›软件包,这很简单:

  1. 将数据放入data_frame
  2. separate列:
  3. data_frame(sa) %>%
        separate(sa, c('Seq', 'Type', 'Length'), sep = ' ', extra = 'drop', convert = TRUE)
    
    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
    

    这(有意)将单元从最后一列中删除,该列现在是冗余的(因为它总是相同的),并将其转换为整数。如果您想保留它,请改用extra = 'merge'

    您可以通过应用另一个函数进一步分隔Type列,与separate非常相似,但指定匹配的部分:{{3 }}。此功能允许您提供extract(必须学习的工具,如果您还不知道它!),它指定要匹配的文本部分。这些部分在括号中:

    '(A\\*\\d{2}:\\d{2}):(.*)'
    

    这意味着:提取两个组 - 第一个组包含字符串“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}):(.*)')
    
    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
    

答案 1 :(得分:4)

使用read.table,这需要一些额外的努力,因为你想要保留在一起的列中的分隔符:

df <- read.table(text = sa, col.names = c("Seq", "Type", "Length", "Unit"))
df$Length <- paste(df$Length, df$Unit)
df[,-4]
#            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

答案 2 :(得分:3)

使用此

as.data.frame.matrix(do.call(rbind,strsplit(sa,"\\s")))

答案 3 :(得分:0)

另一个使用stringr的简单解决方案:

library(stringr)
df <- as.data.frame(str_split_fixed(sa, " ", 3))
colnames(df) <- c("Seq", "Type", "Length")

#           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