【发布时间】: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