当前位置: 首页 > 知识库问答 >
问题:

R:从时间列扩展二进制值序列

辛龙野
2023-03-14

我有一张时间和二进制值的表,

  > 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])

然后,如果time2中的值不等于Time中的值,我使用ifelse循环Time并将其与time2进行比较-

我做的是这样的,

     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中实现这一点吗?

共有1个答案

曹光霁
2023-03-14

如果使用dplyr包中的变异,解决方案相对简单:

library(dplyr)
df <- data.frame(Time, binary) %>%
  mutate(Time=Time-Time[1]) %>%
  mutate(binary=as.logical(binary))

输出

head(df)
# Time binary
# 1 0.000   TRUE
# 2 1.026   TRUE
# 3 1.825  FALSE
# 4 2.949  FALSE
# 5 2.950   TRUE
# 6 3.899   TRUE

如果你想创建新的列,你只需要给它们一个新的名称。

df <- data.frame(Time, binary) %>%
     mutate(time2=Time-Time[1]) %>%
     mutate(new_binary=as.logical(binary))

输出

head(df)
#      Time binary time2 new_binary
# 1 358.214      1 0.000       TRUE
# 2 359.240      1 1.026       TRUE
# 3 360.039      0 1.825      FALSE
# 4 361.163      0 2.949      FALSE
# 5 361.164      1 2.950       TRUE
# 6 362.113      1 3.899       TRUE

此解决方案根据您想要的输出为您提供时间(我希望)。

df <- data.frame(Time, binary) %>%
     mutate(time2=as.numeric(rownames(df))+357.214) %>%
     mutate(new_binary=as.logical(binary))
head(df)

输出

head(df)
#      Time binary   time2 new_binary
# 1 358.214      1 358.214       TRUE
# 2 359.240      1 359.214       TRUE
# 3 360.039      0 360.214      FALSE
# 4 361.163      0 361.214      FALSE
# 5 361.164      1 362.214       TRUE
# 6 362.113      1 363.214       TRUE
 类似资料:
  • 我有一个非常复杂的数据集。但为了简化,我将使用这些数据。假设我们有这个数据,一列X显示不同范围内的数字,另一列是二进制0/1。我想将二进制0/1的序列扩展为1。这将创建新的更长的列(newX,newbinary),形成原始的X和二进制列。 我想在这里扩展 X 列并将二进制值放在它旁边。像这样, 我的尝试是,首先我创建了新的X列(扩展了X)。 然后,我使用for循环遍历newX,然后将该值与X进行比

  • 我在1998-01-01到1998-12-31期间使用TRMM_3B42_Daily产品创建了这个文件。这是我在R中使用的脚本: 通过这个链接,我试图提取值来绘制时间序列,但似乎我正在平均两个单元格的值,而不仅仅是提取单个单元格的值。我该如何解决这个问题?有没有办法创建一个循环,以便它提取不同单元格的值?(在这种情况下,它将是13 x 21=273) 我还发现了另外两个问题,即 excel 文件中

  • 主要内容:语法,示例,不同的时间间隔,多时间系列时间序列是一系列数据点,其每个数据点与时间戳相关联。 一个简单的例子就是股票在某一天不同时间点的股票价格。另一个例子是一年中不同月份某个地区的降雨量。R语言使用许多功能来创建,操纵和绘制时间序列数据。时间序列的数据存储在称为时间序列对象的R对象中。 它也是一个R数据对象,如向量或数据帧。 时间序列对象是通过使用函数创建的。 语法 时间序列分析所使用的函数的基本语法是 - 以下是使用的参数的描述 -

  • 扩展说明 将对象转成字节流,用于网络传输,以及将字节流转为对象,用于在收到字节流数据后还原成对象。 扩展接口 org.apache.dubbo.common.serialize.Serialization org.apache.dubbo.common.serialize.ObjectInput org.apache.dubbo.common.serialize.ObjectOutput 扩展配置

  • 我下载了表视图jar文件库并复制到我项目中的libs文件夹,然后将其从File- 二进制XML文件行#11:二进制XML文件行#11:inflating类com . evren coskun . table view . table view时出错

  • 是否有任何方法可以解析ISO 8601持续时间,例如“P3Y6M4DT12H30M5S”,并返回类似“3年、6个月、4天、12:30:05”的内容 我对润滑剂的持续时间或解析包没有运气。