在R中使用tidyr将行拆分为列

3

我有一个数据集,看起来像这样-

                                                                              col1
1 ATOM 1 N ILE A 12 67.611 47.640 52.312 1.00 12.44 N 2 ATOM 2 CA ILE A 12 66.381 47.660 51.520 1.00 25.25 C

它只有一个名为col1的列。我想将其分成12列,我使用以下命令-

try=separate(subset,col1,c("name","S.No","Atom Name","Residue Name","Symbol","Residue Number","X-cor","Y-cor","Z-cor","Uk1","Uk2","Symbol"), sep= " ")

但我一直收到以下错误,我不明白-
警告信息:在3929个位置上有太多的值:1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20等。
并且它给出了以下输出-
名称S.No原子名称残基名称符号残基编号X-cor Y-cor Z-cor Uk1 Uk2符号
1 ATOM 1 N ILE
2 ATOM 2 CA ILE A
非常感谢任何帮助解决此问题。谢谢!

2
显而易见的评论是,如果您将数据导入此单列格式,请使用read.table或任何更快的等效方法(使用header=FALSE),重新进行操作,避免完全使用separate - thelatemail
2个回答

4

使用 tidyr 库可以有更加优雅的解决方案。但是如果没有这个库,以下是我的解决办法。

data.frame(do.call(rbind, unlist(apply(subset, 1, function(x) strsplit(x, "\\s+")),recursive=FALSE)))

逻辑

我假设您的数据集名称为subset。对于数据框中的每一行,您可以通过空格将其分割成若干部分,即这部分strsplit(x,"\\s+")。其余部分基本上都是为了将其放在一个数据框中。

更新

刚刚解决了,只需在您的代码中将sep= " "替换为sep= "\\s+"\\s+表示至少有一个空格,而您的" "则是恰好一个空格。


1
谢谢@dimitris_ps - 我后来理解了错误,但是无法弄清楚如何修复它。 - Mridul Garg

0

我曾经遇到过同样的问题

解决方案:如果你想分割由 "." 连接的两个字符(或其他任何内容),请不要使用 "sep"。

参考:查看 separate() 文档中提供的示例。

> df <- data.frame(x = c(NA, "a.b", "a.d", "b.c"))
> df %>% separate(x, c("A", "B"))
  A    B
  1 <NA> <NA>
  2    a    b
  3    a    d
  4    b    c

#Reason for warning:

> x="Sepal.Width"
> strsplit(x,split=".")
[[1]]
[1] "" "" "" "" "" "" "" "" "" "" ""

> str_detect(x,".")
[1] TRUE
> str_replace(x,".","_")
[1] "_epal.Width"
> str_replace_all(x,".","_")
[1] "___________"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接