【发布时间】:2021-03-13 20:37:09
【问题描述】:
我有一个时间和二进制值表,
> head(x,10)
Time binary
1 358.214 1
2 359.240 1
3 360.039 0
4 361.163 0
5 361.164 1
6 362.113 1
7 362.114 0
8 365.038 0
9 365.039 0
10 367.488 0
我想在一秒钟后检查二进制列中的值是 1 还是 0,然后创建新值的新列。这里的时间不会继续。例如,这里的第一个值是 (358.214),二进制值是 1,如果我添加第二个,它将是 (359.214),并且基于之前的值,该值仍然是 1,因为 (359.214) 不在数据集中.
我想添加两列,一列用于增加秒数,另一列用于新的二进制值。
time2 new_binary
1 358.214 1
2 359.214 1
3 360.214 0
4 361.214 1
5 362.214 0
6 363.214 0
7 364.214 0
8 365.214 0
9 366.214 0
10 367.214 0
如何在 R 中做到这一点?
数据集,
Time <- c(358.214, 359.240, 360.039, 361.163, 361.164, 362.113, 362.114, 365.038, 365.039, 367.488, 367.489, 368.763, 368.764, 371.538, 371.539, 384.013, 384.014, 386.088, 386.089, 389.463, 389.464, 392.663, 392.664, 414.588, 414.589, 421.463, 421.464, 427.863, 427.864, 431.488, 431.489, 432.074, 432.075, 437.124, 437.125, 439.024, 439.025, 451.724, 451.725, 456.224, 456.225, 457.301, 457.302, 459.526, 459.527, 470.776, 470.777, 471.951, 471.952, 477.651, 477.652, 479.601, 479.602, 480.426, 480.427, 480.950, 480.951, 494.626, 494.627, 516.551, 516.552, 539.901, 539.902, 545.276, 545.277, 546.536, 546.537, 548.436, 548.437, 551.111, 551.112, 556.086, 556.087, 557.561, 557.562, 567.799, 567.800, 580.049, 580.050, 583.249, 583.250, 587.374, 587.375, 588.599, 588.600, 596.199, 596.200, 597.674, 597.675, 601.249, 601.250, 602.499, 602.500, 620.699, 620.700, 631.099, 631.100, 637.249, 637.250, 638.999, 639.000, 650.574, 650.575, 658.199, 658.200, 658.696, 658.697, 668.396, 668.397, 676.021, 676.022, 678.846, 678.847, 688.121, 688.122, 690.371, 690.372, 701.946, 701.947, 704.921, 704.922, 712.346, 712.347, 719.321, 719.322, 721.146, 721.147, 723.496, 723.497, 725.696, 725.697, 727.121, 727.122, 729.871, 729.872, 733.721, 733.722, 739.054, 758.078, 761.321, 761.322, 764.221, 764.222, 768.679, 768.680, 774.529, 774.530, 776.679, 776.680, 778.129, 778.130, 780.779, 780.780, 837.204, 837.205, 842.079, 842.080, 846.329, 846.330, 847.579)
binary <- c(1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0 ,0 ,1 ,1, 0, 0, 1, 1, 0, 0, 1, 1 ,0, 0 ,1 ,1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0 ,0 ,1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 ,0 ,0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1)
更新我的尝试:
首先我得到一个新的秒数序列(比原来的时间长)
time2 <- seq(x$Time[1],x$Time[length])
然后我用 ifelse 循环遍历 Time 并与 time2 比较,如果 time2 中的值不等于 Time 中的值 -> 将 Time 的前一个二进制值放入,否则,获取二进制值。所以我想要一个继续比较两个不同长度列的函数。
我做的是这个,
View(vec_new <-data.frame(time2))
vec_new <- vec_new %>%
mutate(new_Binary = ifelse((x$Time != vec_new$time2)&(vec_new$time2 %l% x$Time),lag(x$binary), x$binary))
但是,由于列的长度不同,我收到了此警告。 “较长的对象长度不是较短对象长度的倍数”
而且,结果并没有像我预期的那样退出。我不知道这个循环如何通过值以及如何循环所有值。我得到了一个完整的二进制文件,直到时间结束。
知道如何在 R 中实现这一点吗?
【问题讨论】:
-
为什么
Time和binary的长度不同?它们是同一个数据框的一部分吗?我也不清楚你是如何创建time2和new_binary。 -
好问题!这里的目标是创建一个新的 0/1 序列。原始数据是时间和二进制。由此,我想根据二进制值扩展时间来测量 1 的长度。将时间扩展为相隔1秒后得到time2和new_binary,然后根据原始二进制的对应值创建1/0的新序列。例如,358.214 = 1,359.214 仍为 =1,但 360.214 介于 360.039 和 361.163 之间,为 = 0,依此类推。
-
您删除了
Time数据中的所有逗号,这会返回错误。 -
@RonakShah 更新了我的问题并发布了我的尝试。
标签: r dataframe binary time-series