【问题标题】:Conditional merge of multiple lines in RR中多行的条件合并
【发布时间】:2021-02-03 02:52:45
【问题描述】:

我正在尝试重新组织我的数据:我在一个 data.table 中有数十万行,我需要将其中一些行合并到一行“事件”中。

我的数据分为三列:Vid(“值标识符”)、日期和值。

有四个“值标识符”,因此有四种类型的线:T 代表温度,X 代表重量,O 代表偏移量,R 代表一个九位代码来识别个人。

通常有许多 O 行(有时还有 T 行),直到出现“事件”并按如下方式组成:一到三个 R 行,然后是可变数量的 X 行。事件通过一系列其他 O 线(参见示例 1)或对个体的另一次检测(可能相同或另一个)结束:一到三个 R 线(参见示例 2)。

示例 1:

Vid Date            Value
O   08.12.19 02:52  355098
T   08.12.19 02:52  2790
O   08.12.19 02:52  354840
O   08.12.19 02:52  3550
R   08.12.19 03:27  700D98F47
R   08.12.19 03:27  700D98F47
R   08.12.19 03:27  700D98F47
X   08.12.19 03:27  753120
X   08.12.19 03:27  738112
X   08.12.19 03:27  743529
X   08.12.19 03:27  747500
X   08.12.19 03:27  743649
X   08.12.19 03:27  748238
X   08.12.19 03:27  744651
X   08.12.19 03:27  749100
X   08.12.19 03:27  750620
X   08.12.19 03:27  749487
X   08.12.19 03:27  762122
X   08.12.19 03:27  759209
X   08.12.19 03:27  756425
X   08.12.19 03:27  756655
X   08.12.19 03:27  757576
X   08.12.19 03:27  754173
X   08.12.19 03:27  754731
X   08.12.19 03:27  752270
X   08.12.19 03:27  749258
O   08.12.19 03:31  371176
O   08.12.19 03:31  371511
O   08.12.19 03:31  370918

示例2:

Vid Date            Value
O   08.12.19 02:52  355098
O   08.12.19 02:52  354840
T   08.12.19 02:52  2790
O   08.12.19 02:52  3550
R   08.12.19 03:27  700D98F47
R   08.12.19 03:27  700D98F47
X   08.12.19 03:27  753120
X   08.12.19 03:27  738112
X   08.12.19 03:27  743529
X   08.12.19 03:27  747500
X   08.12.19 03:27  743649
X   08.12.19 03:27  748238
X   08.12.19 03:27  744651
X   08.12.19 03:27  749100
X   08.12.19 03:27  750620
X   08.12.19 03:27  749487
X   08.12.19 03:27  762122
X   08.12.19 03:27  759209
X   08.12.19 03:27  756425
X   08.12.19 03:27  756655
R   08.12.19 03:27  600D56F20
X   08.12.19 03:27  754731
X   08.12.19 03:27  752270
X   08.12.19 03:27  749258
X   08.12.19 03:27  749257
O   08.12.19 03:31  371176
O   08.12.19 03:31  371511
O   08.12.19 03:31  370918

我正在尝试将每个“事件”的数据合并到一行中,如下所示:

Date                R           R           R           X1      X2      X3  
08.12.19 03:27      700D98F47   700D98F47   700D98F47   753120  738112  743529  …

即使日期在每个值下方重复也可以

此外,包括事件前后的偏移量会非常有用。

Date                O1      R           R           R           X1      X2      X3           O2 
08.12.19 03:27      355085  700D98F47   700D98F47   700D98F47   753120  738112  743529  …    371176

对于示例 2:

Date                O1      R           R           R           X1      X2      X3           O2 
08.12.19 03:27      355085  700D98F47   700D98F47   NA          753120  738112  743529  …    371176
08.12.19 03:27      355085  600D56F20   NA          NA          754731  752270  749258  …    371176

我已经搜索并仅找到了在终端上使用 sed 或 awk 命令解决类似问题的解决方案。

awk:https://www.theunixschool.com/2012/05/awk-join-or-merge-lines-on-finding.html

sed:sed: conditional merge of multiple lines

我希望将所有数据清理保留在 R 上,因此我尝试使用包 Kmisc 来使用 awk (https://www.rdocumentation.org/packages/Kmisc/versions/0.5.0/topics/awk)

awk("/R/{if (x)print x;print;x="";next}{x=(!x)?$0:x","$0;}END{print x;}", tempfileExample)

并使用命令 system(paste("sed ...'") 来使用 sed。

system(paste("sed ':a;$!N;s/\1//;ta;P;D'" ,tempfileExample))

但我不知道如何更改指示合并完成方式的代码部分:例如“a;$!N;s/\1//”

是否可以在 R 上使用 sed 或 awk 来做到这一点?在 R 上还有其他更好的方法吗?

感谢您的帮助和时间

【问题讨论】:

  • 您是否尝试过这里的解决方案 - stackoverflow.com/questions/5890584/…
  • 这似乎不适合,因为我需要合并来自不同值的行。 @potong 的答案在终端中运行良好。知道如何将它集成到 R 中吗?如果我使用system(paste("sed code ,dt)),我得到Error: '\s' is an unrecognized escape in character string starting ""sed -E '/^R/{s/^R\s",如果我用“\\”转义那些“\”,我得到"error in running command"

标签: r awk sed merge conditional-statements


【解决方案1】:

这可能会给你一个开始(GNU sed):

sed -E '/^R/{s/^R\s+//;:a;N;s/\nR.*\s+/ /;ta;bc;:b;N;:c;s/\nX.*\s/ /;tb;P;D};d' file

收集所有R 记录,然后是任何X 记录,删除所有记录的记录标识符以及除第一个集合之外的所有记录的日期和时间。

删除所有其他记录。

【讨论】:

  • 谢谢,当 R 只有 2 或 1 时,它只是缺少 NA 值(参见示例 2 的所需输出),但它已经非常有用了。 08.12.19 03:27 700D98F47 700D98F47 753120 738112 743529 ... 08.12.19 03:27 600D56F20 754731 752270 749258 749257 ...
  • 对不起,我现在才注意到我没有将问题标记为已解决(我已经给出了一个点,但似乎我没有足够的点给他们)。即使我还没有弄清楚如何修改此代码以获取 NA 值(当 R 行小于 3 时),您的解决方案在清理数据方面帮助了我很多!谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 2017-04-12
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2023-01-18
相关资源
最近更新 更多