我有每分钟的数据,看起来像这样,有30个不同的唯一ID.每行包含每分钟的测量值,如果测量值由技术人员验证,则值为1.

ID dttm Measurement Verified?
1 1-1-2023 08:00 89 1
1 1-1-2023 08:01 90 0
1 1-1-2023 08:02 96 0
1 1-1-2023 08:03 92 0
1 1-1-2023 08:04 98 0
1 1-1-2023 08:05 88 0
1 1-1-2023 08:06 86 0
1 1-1-2023 08:07 91 0
1 1-1-2023 08:08 94 0
1 1-1-2023 08:09 100 0
1 1-1-2023 08:10 81 0
1 1-1-2023 08:11 82 0
1 1-1-2023 08:12 95 0
1 1-1-2023 08:13 90 0
1 1-1-2023 08:14 87 0
1 1-1-2023 08:15 91 1
1 1-1-2023 08:16 89 0
1 1-1-2023 08:17 90 0
1 1-1-2023 08:18 96 0
1 1-1-2023 08:19 92 0
1 1-1-2023 08:20 98 0
1 1-1-2023 08:21 88 0
1 1-1-2023 08:22 86 0
1 1-1-2023 08:23 91 0
1 1-1-2023 08:24 94 0
1 1-1-2023 08:25 100 0
1 1-1-2023 08:26 81 0
1 1-1-2023 08:27 82 0
1 1-1-2023 08:28 95 0
1 1-1-2023 08:29 90 0
1 1-1-2023 08:30 87 0
1 1-1-2023 08:31 91 0
1 1-1-2023 08:32 89 0
1 1-1-2023 08:33 90 0
1 1-1-2023 08:34 96 0
1 1-1-2023 08:35 92 0
1 1-1-2023 08:36 98 0
1 1-1-2023 08:37 88 0
1 1-1-2023 08:38 86 0
1 1-1-2023 08:39 91 0
1 1-1-2023 08:40 94 0
1 1-1-2023 08:41 100 0
1 1-1-2023 08:42 81 0
1 1-1-2023 08:43 82 0
1 1-1-2023 08:44 95 0
1 1-1-2023 08:45 90 0
1 1-1-2023 08:46 87 0
1 1-1-2023 08:47 91 0
1 1-1-2023 08:48 89 0
1 1-1-2023 08:49 90 0
1 1-1-2023 08:50 96 0
1 1-1-2023 08:51 92 0
1 1-1-2023 08:52 98 0
1 1-1-2023 08:53 88 0
1 1-1-2023 08:54 86 0
1 1-1-2023 08:55 91 0
1 1-1-2023 08:56 94 0
1 1-1-2023 08:57 100 0
1 1-1-2023 08:58 81 0
1 1-1-2023 08:59 82 0
1 1-1-2023 09:00 95 1
1 1-1-2023 09:01 90 0
1 1-1-2023 09:02 87 0
1 1-1-2023 09:03 91 0

等等,每个ID总共需要2880分钟.

我希望实现的是将前59分钟围绕验证值旋转,以便前59分钟中的每一分钟都有一列.

例如,由于ID 1的值在1—1—2023 09:00之前有59分钟,结果将是:

ID Verified_Time min_1 min_2 min_3 min_4 min_5 min_6 min_7 min_8 ... min_59 verified
1 1-1-2023 09:00 90 96 92 98 88 86 91 94 ... 82 95

我知道如何在列周围做一个简单的枢轴更宽,但我不确定如何枢轴,如果值是验证和有59个前面的值.

推荐答案

由于您知道如何在列周围进行pivot_wider,我们只需要构造一个类似于列表的东西,其条目是相关日期周围的数据的子集.

相关日期是那些被验证的日期,并且在df内有59个先前值.它们可以通过以下方式获得.在我的示例中,我使用了您的数据,并额外将日期设置为09:02.

library(dplyr)

df |>
  filter(
    `Verified?` == 1 &
      dttm - as.difftime(59, units = "mins") > min(dttm),
    .by = ID
  ) |>
  pull(dttm)

# [1] "2023-01-01 09:00:00 CET" "2023-01-01 09:02:00 CET"

对于这样的VerifiedDate,相关数据子集可以通过以下方式获得:

df |> filter(between(
  dttm,
  VerifiedDate - as.difftime(59, units = "mins"),
  VerifiedDate
))

使用purrr::map将其组合在一起会产生所需的帧列表.现在,你可以在每个帧上使用旋转来获得所需的输出.

purrr::map(df |>
             filter(
               `Verified?` == 1 &
                 dttm - as.difftime(59, units = "mins") > min(dttm),
               .by = ID
             ) |>
             pull(dttm)
           , function (VerifiedDate) {
             df |> filter(between(
               dttm,
               VerifiedDate - as.difftime(59, units = "mins"),
               VerifiedDate
             ))
           })

#[[1]]
# A tibble: 60 × 4
#      ID dttm                Measurement `Verified?`
#   <int> <dttm>                    <int>       <int>
# 1     1 2023-01-01 08:01:00          90           0

...

#[[2]]
# A tibble: 60 × 4
#      ID dttm                Measurement `Verified?`
#   <int> <dttm>                    <int>       <int>
# 1     1 2023-01-01 08:03:00          92           0

所用数据:

> dput(df)
structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L), dttm = structure(c(1672556400, 1672556460, 
1672556520, 1672556580, 1672556640, 1672556700, 1672556760, 1672556820, 
1672556880, 1672556940, 1672557000, 1672557060, 1672557120, 1672557180, 
1672557240, 1672557300, 1672557360, 1672557420, 1672557480, 1672557540, 
1672557600, 1672557660, 1672557720, 1672557780, 1672557840, 1672557900, 
1672557960, 1672558020, 1672558080, 1672558140, 1672558200, 1672558260, 
1672558320, 1672558380, 1672558440, 1672558500, 1672558560, 1672558620, 
1672558680, 1672558740, 1672558800, 1672558860, 1672558920, 1672558980, 
1672559040, 1672559100, 1672559160, 1672559220, 1672559280, 1672559340, 
1672559400, 1672559460, 1672559520, 1672559580, 1672559640, 1672559700, 
1672559760, 1672559820, 1672559880, 1672559940, 1672560000, 1672560060, 
1672560120, 1672560180), class = c("POSIXct", "POSIXt"), tzone = ""), 
    Measurement = c(89L, 90L, 96L, 92L, 98L, 88L, 86L, 91L, 94L, 
    100L, 81L, 82L, 95L, 90L, 87L, 91L, 89L, 90L, 96L, 92L, 98L, 
    88L, 86L, 91L, 94L, 100L, 81L, 82L, 95L, 90L, 87L, 91L, 89L, 
    90L, 96L, 92L, 98L, 88L, 86L, 91L, 94L, 100L, 81L, 82L, 95L, 
    90L, 87L, 91L, 89L, 90L, 96L, 92L, 98L, 88L, 86L, 91L, 94L, 
    100L, 81L, 82L, 95L, 90L, 87L, 91L), `Verified?` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    0L, 1L, 0L)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-64L))

R相关问答推荐

对lme 4对象运行summary()时出错(diag中的错误(from,names = RST):对象unpackedMatrix_diag_get找不到)

如何求解arg必须为NULL或deSolve包的ode函数中的字符向量错误

名称输出pmap on tible

R:连接值,而不是变量?

如何从R中的字符串元素中减go 一个数字?

修改用R编写的用户定义函数

当月份额减go 当月份额

在连续尺度上转置标签[瀑布图,R]

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

如何写商,水平线,在一个单元格的表在R

更改STAT_VALLES/STAT_PEAKS中的箭头线宽/大小

在具有多个响应变量的比例堆叠条形图上方添加总计

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

`-`是否也用于数据帧,有时使用引用调用?

层次树图的数据树

根据r中每行中的日期序列,使用列名序列创建新列

按组使用dummy r获取高于标准的行的平均值

如何使投篮在R中保持一致

从两个数据帧中,有没有办法计算R中一列的唯一值?

将`magick`对象转换为原始向量