首页 > 解决方案 > 尝试通过增加 R 中的时间步长来缩小数据帧的大小

问题描述

我有一列以毫秒为单位记录时间,从 0 开始并均匀增加 0.001。我想通过创建一个只记录每十毫秒发生的行的新数据框来缩小我的数据框。

我的问题是数据是长格式的,并非所有参与者都花费相同的时间来完成任务,所以我不能每 10 行一次。

尝试澄清一下,这意味着每当时间列中有 0.000 时,我想将此点记录在新的数据帧中,然后重新开始每十分之一毫秒的过程。到目前为止,我已经尝试使用“过滤器”和“子集”但没有成功。

这是我拥有的数据的一个小例子:

ID 时间 X
1 0.000 1 5
1 0.001 2 10
1 0.002 3 15
1 0.003 4 20
1 0.004(依此类推……直到 0.052) ... ...
1 0.053 10 25
2 0.000 30 30
2 0.001 35 35
2 0.002(依此类推...直到 0.036) ... ...
2 0.037 50 55
3 0.000 55 50

这就是我想要的:

ID 时间 X
1 0.000 1 5
1 0.010 30 40
1 0.020 35 45
1 0.030 30 40
1 0.040 33 44
1 0.050 60 100
2 0.000 30 30
2 0.010 40 40
2 0.020 50 50
2 0.030 60 60
3 0.000 55 50

标签: r

解决方案


你可以试试下面的subset++aveduplicated

subset(
  df,
  !ave(Time, ID, FUN = function(x) duplicated(ceiling(seq_along(x) / 10)))
)

这使

   ID Time
1   1 0.00
11  1 0.01
21  1 0.02
31  1 0.03
41  1 0.04
51  1 0.05
55  2 0.00
65  2 0.01
75  2 0.02
85  2 0.03
92  3 0.00

数据

> dput(df)
structure(list(ID = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3), Time = c(0,
0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009,
0.01, 0.011, 0.012, 0.013, 0.014, 0.015, 0.016, 0.017, 0.018,
0.019, 0.02, 0.021, 0.022, 0.023, 0.024, 0.025, 0.026, 0.027,
0.028, 0.029, 0.03, 0.031, 0.032, 0.033, 0.034, 0.035, 0.036,
0.037, 0.038, 0.039, 0.04, 0.041, 0.042, 0.043, 0.044, 0.045, 
0.046, 0.047, 0.048, 0.049, 0.05, 0.051, 0.052, 0.053, 0, 0.001,
0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01,
0.011, 0.012, 0.013, 0.014, 0.015, 0.016, 0.017, 0.018, 0.019,
0.02, 0.021, 0.022, 0.023, 0.024, 0.025, 0.026, 0.027, 0.028,
0.029, 0.03, 0.031, 0.032, 0.033, 0.034, 0.035, 0.036, 0)), row.names = c(NA,
-92L), class = "data.frame")

推荐阅读