gpt4 book ai didi

r - data.table:查找每个组和列名的重复数据。重复的输出组和列名

转载 作者:行者123 更新时间:2023-12-01 09:28:04 25 4
gpt4 key购买 nike

我希望使用 data.table 检测“卡住”的传感器数据。为此,我可以检查最近 3 天的数据,看看对于给定的列,该数据是否相同。我希望输出是卡住传感器的 UID,然后是卡住传感器流的名称(即“温度”、“压力”等)。

示例:我有以下数据表:

library(data.table)
dt <- data.table(UID = c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3),
report_date = rep(seq.Date(as.Date("2019/1/1"), as.Date("2019/1/6"), 'days'), 3),
temperature = c(101,103,105,101,105,104,105,103,101,102,102, 102,103,101,102,105,106,111),
pressure = c(10.2,10.4,10.7,10.5,10.1,10.2,10.1,10.5,10.11,10.22,10.11,10.11,10.1,10.1,10.1,10.3,10.3,10.3),
voltage = c(0.023,0.025,0.011,0.013,0.0254,0.028,0.028,0.077,0.026,0.0236,0.0258,0.0214,0.089,0.034,0.0387,0.0654,0.0246,0.02133))

dt
UID report_date temperature pressure voltage
1: 1 2019-01-01 101 10.20 0.02300
2: 1 2019-01-02 103 10.40 0.02500
3: 1 2019-01-03 105 10.70 0.01100
4: 1 2019-01-04 101 10.50 0.01300
5: 1 2019-01-05 105 10.10 0.02540
6: 1 2019-01-06 104 10.20 0.02800
7: 2 2019-01-01 105 10.10 0.02800
8: 2 2019-01-02 103 10.50 0.07700
9: 2 2019-01-03 101 10.11 0.02600
10: 2 2019-01-04 102 10.22 0.02360
11: 2 2019-01-05 102 10.11 0.02580
12: 2 2019-01-06 102 10.11 0.02140
13: 3 2019-01-01 103 10.10 0.08900
14: 3 2019-01-02 101 10.10 0.03400
15: 3 2019-01-03 102 10.10 0.03870
16: 3 2019-01-04 105 10.30 0.06540
17: 3 2019-01-05 106 10.30 0.02460
18: 3 2019-01-06 111 10.30 0.02133

输出应产生 2 行,1. ID = 2 和 colID =“温度”,2. ID = 3 和 colID =“压力”,因为温度在过去 3 天内重复了 3 次 ID = 2 ID = 3 的压力。

    UID  colID
1. 2 temperature
2. 3 pressure

我可以想出使用 base R 和循环来执行此操作的方法,但对正确的 data.table 方法一无所知。

最佳答案

你可以使用

frozen = function(x) uniqueN(tail(x, 3)) == 1
dt[, .(colID = c(
'temperature'[frozen(temperature)],
'pressure'[frozen(pressure)])),
by=UID]
# UID colID
# 1: 2 temperature
# 2: 3 pressure

另一种版本是在对卡住的变量进行子集化之前融化数据。如果有许多测量变量,而不仅仅是您示例中的温度和压力,这可能会更简洁一些。

cols = c('temperature', 'pressure')
dtm = melt(dt, id = 'UID', measure = cols)
dtm[, frozen(value), by = .(UID, variable)][(V1)]

关于值是否“卡住”的正确测试的注释

有多种方法可以测试同一向量的元素之间是否相等。看看答案here查看一些选项。最好的方法完全取决于您想要什么。像我上面那样使用 UniqueN 将检查值是否真正卡住,因为 float 是相同的。根据您的具体用例和仪器的工作方式,您可能更愿意根据不同的标准检查它们是否“相同”,例如在绝对或相对机器公差范围内几乎相同。请务必阅读关于 this answer 的评论对于一些细微差别。

如果您决定进行不同的测试,只需在上面我使用 UniqueN 的地方替换它即可。

关于r - data.table:查找每个组和列名的重复数据。重复的输出组和列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54134742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com