假设我有一个字符串数组,如:
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
答案 0 :(得分:5)
data_frame
,separate
列: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