【问题标题】:Split file with multimple delimiter and column numbers使用多个分隔符和列号拆分文件
【发布时间】:2013-03-22 19:24:45
【问题描述】:

我收到了一个具有以下结构的统计输出文件:

> dput(x)
structure(list(V1 = c(0.236364, 0.032086, 0.062762, 0.095238, 
NaN, 0, 1, 2, 3, 4, 0.258706, 0.436735, 0.104167, 0.611336, 0.160279
), V2 = c(0.183333, 0.623333, 0.796667, 0.14, 0, NA, NA, NA, 
NA, NA, 0.67, 0.816667, 0.96, 0.823333, 0.956667), V3 = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -15L)) 

读取数据的链接: https://docs.google.com/file/d/0BxSZDr4eTnb9aDhCOGRxVEV5aVE/edit?usp=sharing

数据属性:

  • 无标题

  • 文件使用特定的分隔符选项
    numeric[space][tab][space]numeric[space][tab][space] # 用于 2 个数值列组件

  • 行号可能明显不同,但组件 2 和 3 始终相同


我需要将其拆分为每个组件的 data.frames:
1 个组件 - 第一个两列部分
2 个组件 - 1 个列部分
3 个组件 - 第二个两列部分

我找不到将相似数据文件拆分为 3 个组件的通用方法。

我找到了使用不同分隔符作为拆分对象的示例,但没有使用列号和分隔符选项的这种特殊情况。

请让我知道这个例子是否足够。我不确定分隔符选项对于这个特定问题的相关性如何。我认为不是。

【问题讨论】:

  • 好像只有两列?或者最后一列是[空格] [制表符] [空格]?难道你不能只使用 read.table,将分隔符设置为 sep=" \t " (带空格),然后从那里取它吗?
  • @ako: 是的,只有 两个 列包含数据,但在每个最后一个数字条目之后都有分隔符在第 1 和第 3 部分。它们与提取重要数据无关。 read.table() 正确处理将数据读入 3 列(第 3 列为空)。这并不能解决我的问题,即寻找一种通用方法来拆分 3 个组件。
  • 在组件 1 或组件 3 的第二列中是否会有 NA 值?
  • 能否也显示您期望的输出,谢谢?

标签: r


【解决方案1】:

如果组件 1 或组件 3 数据的第二列中没有 NA 值,则此处可以使用 rle。如果我正确理解您的问题并且相关条件成立,基本方法是查看dput 数据中“V2”列中NA 值的runs你已经分享了。 is.na(x$V2) 会返回一个逻辑向量,然后我们可以使用rle 来确定在哪里拆分数据:

> RLE <- rle(is.na(x$V2))$lengths
> split(x, rep(seq(RLE), RLE))
$`1`
        V1       V2 V3
1 0.236364 0.183333 NA
2 0.032086 0.623333 NA
3 0.062762 0.796667 NA
4 0.095238 0.140000 NA
5      NaN 0.000000 NA

$`2`
   V1 V2 V3
6   0 NA NA
7   1 NA NA
8   2 NA NA
9   3 NA NA
10  4 NA NA

$`3`
         V1       V2 V3
11 0.258706 0.670000 NA
12 0.436735 0.816667 NA
13 0.104167 0.960000 NA
14 0.611336 0.823333 NA
15 0.160279 0.956667 NA

【讨论】:

  • 马赫蒂:是的。按预期工作。对于第二个组件,V2 和 V3 将始终为 NA,而对于第一个和第三个组件永远不会,这使您的方法变得容易。这是我在几天内发现的第二个有用的 rle 示例!谢谢。现在的想法是 rbind() 来自列表对象 2 和 3 的非 NA 列。
  • @PauloCardoso,你的意思是 rbind 对象 1 和 3?如果这是你的最终目标,我会采取不同的方法:&gt; x$V3 &lt;- NULL; &gt; x[!is.na(x$V2), ]
  • 对象 2 和 3。使用 x[!is.na(x$V2), ] 不会捕获所需的组件。
  • @PauloCardoso,那么您的意思是 cbind 而不是 rbind-- 仍然不清楚您的最终目标。
  • 我的意思是rbind()。组件 2 和 3 之间存在对应关系。组件 3 的每一行都是与组件 2 的同一行相关的一个因素。这就是组件 2 和 3 始终相同的原因。清楚吗?感谢您讨论这个问题。
【解决方案2】:

您可以先将 3 个字符分隔符转换为一个字符分隔符吗?

您可以在命令行上尝试:

cat input.txt | sed 's/ \t /\t/g' > input2.txt

这会将所有“\t”替换为“\t”

或者你可以在你最喜欢的 txt 编辑器中打开它并查找/替换所有

一旦分隔符采用标准格式,进一步处理就会容易得多

【讨论】:

  • 谢谢。分隔符似乎很容易解决。一个没有 sep 选项的简单 read.delim2() 将创建 3 列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
相关资源
最近更新 更多