【问题标题】:Splitting rows into columns in R using tidyr使用 tidyr 将行拆分为 R 中的列
【发布时间】:2016-05-17 13:47:51
【问题描述】:

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

 col1

1 原子 1 N ILE A 12 67.611 47.640 52.312 1.00 12.44 N
2 原子 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, ...

它给了我以下输出-

name S.No Atom Name Residue Name Symbol Residue Number X-cor Y-cor Z-cor Uk1 Uk2 Symbol 1 个原子 1 个 N ILE 2 原子 2 CA ILE A

非常感谢任何解决此问题的帮助。谢谢!

【问题讨论】:

  • 显而易见的评论是,如果您将数据导入这一列格式,请使用read.table 或其他更快的等效项(使用header=FALSE)重做,并完全避免使用separate .

标签: r tidyr


【解决方案1】:

tidyr 应该有一个更优雅的解决方案。但是没有那个库,这就是我所拥有的

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

逻辑

我假设您的数据集名称是 subset。对于 data.frame 的每一行,您将其按空格分开,这是strsplit(x, "\\s+")) 的这一部分。剩下的基本上就是把它放在一个data.frame中。

更新

刚刚想通了,在您的代码中只需将sep= " " 替换为sep= "\\s+"\\s+ 至少在空间上声明,而您的 " " 恰好是一个空间。

【讨论】:

  • 谢谢@dimitris_ps - 我后来明白了这个错误,但不知道如何解决它。
【解决方案2】:

我也遇到了同样的问题

解决方案:- 如果你想分割两个用“.”连接的字符(或任何东西),不要使用“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] "___________"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2014-09-16
    • 2020-03-26
    • 2015-08-29
    相关资源
    最近更新 更多