【发布时间】:2019-07-05 18:15:04
【问题描述】:
我正在尝试清理一些泵站数据,这些数据来自工厂操作员手动输入基于 Excel 的日志工作簿值的日期和停止/启动量。使这件事变得棘手的是,这三个值是作为跨多列的重复行输入的。有点难以口头描述(更不用说寻找是否有人有类似的问题),因此称其为“半融化”。以下是其中一些的 dput:
structure(list(X1 = c("DATE", "STOP", "START", "DATE", "STOP",
"START", "DATE", "STOP", "START", "DATE"), X2 = c(43466, 654896,
654276, 43470, 657669, 656819, 43474, 660160, 659368, 43478),
X3 = c("DATE", "STOP", "START", "DATE", "STOP", "START",
"DATE", "STOP", "START", "DATE"), X4 = c(43467, 655298, 654896,
43471, 658268, 657669, 43475, 660977, 660160, 43479), X5 = c("DATE",
"STOP", "START", "DATE", "STOP", "START", "DATE", "STOP",
"START", "DATE"), X6 = c("43468", "655959", "655298", "43472",
"658620", "658268", "43476", "661774", "660977", "43480"),
X7 = c("DATE", "STOP", "START", "DATE", "STOP", "START",
"DATE", "STOP", "START", "DATE"), X8 = c("43469", "656819",
"655959", "43473", "659368", "658620", "43477", "662673",
"661774", "43481")), row.names = c(NA, 10L), class = "data.frame")
我想将其整理成一个包含 DATE、START 和 STOP 三列的时间序列。看起来像这样的东西:
Date Start Stop
1 43466 654276 654896
2 43470 656819 657669
3 43474 659368 660160
4 43478 662673 663168
5 43482 665148 665951
6 43486 667944 668537
7 43490 670950 671692
8 43494 673621 674418
9 43497 676090 676884
10 43501 678559 679399
我从来没有对收集和传播函数有很好的感觉(仍然更喜欢 melt 和 dcast),但令我高兴的是,我看到了更新后的函数 pivot_longer 和 pivot_wider。我在上述任何函数中都有一个整洁的解决方案,但我一直被那些希望当前列名(“X1”到“X8”)有意义的函数卡住,但实际上它们是任意的。
有什么建议吗?
【问题讨论】:
-
您的
DATEs 比STARTs 和STOPs 多。是否缺少某些数据? -
假设您没有最后一行日期的数据,
df %>% slice(-10) %>% unclass() %>% split(rep(seq(length(.) / 2), each = 2)) %>% map(set_names, c('key', 'value')) %>% bind_rows() %>% mutate(i = rep(seq(n()/3), each = 3)) %>% spread(key, value) %>% select(-i) -
或
df %>% slice(-10) %>% gather(col, value, num_range('X', (1:4)*2)) %>% select(X1, value) %>% mutate(i = rep(seq(n()/3), each = 3)) %>% spread(X1, value) %>% select(-i) -
哦,这些只是这个数据集的前 10 行,应该选择三的倍数以使其更清晰!有一年的观察价值:)。