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

创建一个变量,包括日期时间变量的滞后和超前

宇文俊风
2023-03-14

我有一个数据集,它以某种方式类似于以下示例。我正在尝试创建一个与“预期”变量相同的变量。也就是说,如果date_time为“2020-01-02 12:00”,则创建一个变量,包括滞后、超前和date_time的水平值。

提前谢谢你。

    df <- tibble(
             date_time = c("2020-01-01 10:00","2020-01-01 11:00","2020-01-01 12:00","2020-01-01 13:00","2020-01-01 14:00","2020-01-02 10:00","2020-01-02 11:00","2020-01-02 12:00","2020-01-03 10:00","2020-01-03 11:00"), 
             
             date = c("2020-01-01","2020-01-01","2020-01-01","2020-01-01","2020-01-01","2020-01-02","2020-01-02","2020-01-02","2020-01-03","2020-01-03"),
               x= seq.default(1,5.5,.5),
date_time_NA = c(NA,"2020-01-01 11:00",NA,NA,NA,NA,NA,"2020-01-02 12:00",NA,NA),
            expected = c("2020-01-01 10:00","2020-01-01 11:00","2020-01-01 12:00",NA,NA,NA,"2020-01-02 11:00","2020-01-02 12:00","2020-01-03 10:00",NA) 
             )
df

我改变了上面的例子。所以我试图告诉R找到date_time_NA没有丢失的地方,然后创建一个变量,包括date_time的滞后、领先和水平值(类似于预期)。

我用@akrun分享的代码想出了一个解决方案。这可能不是一个非常聪明的解决方案;然而,我觉得它很直观。主要思想是使用ifelse来查找没有丢失date_time_NA的位置。然后我们可以再次使用row_number()并加1,这样它就可以找到领先点并扣除1,这样它就可以找到滞后位置并将它们替换为date_time的值。

df %>%
 mutate(na_row = ifelse(!is.na(date_time_NA),row_number(),NA),
       
         row_level_lag = ifelse(row_number() %in% c(na_row), date_time,NA), 
       
         row_level_now = ifelse(row_number() %in% c(na_row + 1), date_time,NA),
       
         row_level_lead = ifelse(row_number() %in% c(na_row - 1), date_time,NA),
       
         date_time_expected = glue("{row_level_lag} {row_level_now} {row_level_lead}"), 
       
         date_time_expected = stringr::str_replace_all(string = date_time_expected,pattern = "NA",replacement = "")) 

共有1个答案

端木乐语
2023-03-14

我们可以使用< code>match来获取相关“date_time”值的索引,然后通过添加来自< code>-1:1的序列来获取上一个值和下一个值的索引。使用它创建一个子集值为“date_time”的“新”列

i1 <- match("2020-01-02 12:00", df$date_time)
i2 <- i1 + (-1:1)
df$new <- NA_character_
df$new[i2] <- df$date_time[i2]

-输出

df
# A tibble: 10 x 5
#   date_time        date           x expected         new             
#   <chr>            <chr>      <dbl> <chr>            <chr>           
# 1 2020-01-01 10:00 2020-01-01   1   <NA>             <NA>            
# 2 2020-01-01 11:00 2020-01-01   1.5 <NA>             <NA>            
# 3 2020-01-01 12:00 2020-01-01   2   <NA>             <NA>            
# 4 2020-01-01 13:00 2020-01-01   2.5 <NA>             <NA>            
# 5 2020-01-01 14:00 2020-01-01   3   <NA>             <NA>            
# 6 2020-01-02 10:00 2020-01-02   3.5 <NA>             <NA>            
# 7 2020-01-02 11:00 2020-01-02   4   2020-01-02 11:00 2020-01-02 11:00
# 8 2020-01-02 12:00 2020-01-02   4.5 2020-01-02 12:00 2020-01-02 12:00
# 9 2020-01-03 10:00 2020-01-03   5   2020-01-03 10:00 2020-01-03 10:00
#10 2020-01-03 11:00 2020-01-03   5.5 <NA>             <NA>            

使用< code>dplyr,我们可以使用< code>replace替换“date_time”中与“date_time”的< code>match索引不匹配的值,以及< code>NA的上一个和下一个索引

library(dplyr)
df %>% 
   mutate(new = replace(date_time,
   !row_number()  %in% (match("2020-01-02 12:00", 
           df$date_time) + (-1:1)), NA_character_ ))

-输出

# A tibble: 10 x 5
#   date_time        date           x expected         new             
#   <chr>            <chr>      <dbl> <chr>            <chr>           
# 1 2020-01-01 10:00 2020-01-01   1   <NA>             <NA>            
# 2 2020-01-01 11:00 2020-01-01   1.5 <NA>             <NA>            
# 3 2020-01-01 12:00 2020-01-01   2   <NA>             <NA>            
# 4 2020-01-01 13:00 2020-01-01   2.5 <NA>             <NA>            
# 5 2020-01-01 14:00 2020-01-01   3   <NA>             <NA>            
# 6 2020-01-02 10:00 2020-01-02   3.5 <NA>             <NA>            
# 7 2020-01-02 11:00 2020-01-02   4   2020-01-02 11:00 2020-01-02 11:00
# 8 2020-01-02 12:00 2020-01-02   4.5 2020-01-02 12:00 2020-01-02 12:00
# 9 2020-01-03 10:00 2020-01-03   5   2020-01-03 10:00 2020-01-03 10:00
#10 2020-01-03 11:00 2020-01-03   5.5 <NA>             <NA>            

如果匹配的元素不止一个,那么我们创建一个分组列并应用相同的代码

library(tidyr)
df %>%
    mutate(grp = lead(cumsum(!is.na(date_time_NA)))) %>%
    fill(grp) %>%
    group_by(grp) %>% 
    mutate(new = replace(date_time,
      !row_number()  %in% (match(date_time_NA[complete.cases(date_time_NA)][1],
            date_time) + (-1:1)), NA_character_ )) %>%
     ungroup %>%
    select(-grp)
# A tibble: 10 x 6
#   date_time        date           x date_time_NA     expected         new             
#   <chr>            <chr>      <dbl> <chr>            <chr>            <chr>           
# 1 2020-01-01 10:00 2020-01-01   1   <NA>             2020-01-01 10:00 2020-01-01 10:00
# 2 2020-01-01 11:00 2020-01-01   1.5 2020-01-01 11:00 2020-01-01 11:00 2020-01-01 11:00
# 3 2020-01-01 12:00 2020-01-01   2   <NA>             2020-01-01 12:00 2020-01-01 12:00
# 4 2020-01-01 13:00 2020-01-01   2.5 <NA>             <NA>             <NA>            
# 5 2020-01-01 14:00 2020-01-01   3   <NA>             <NA>             <NA>            
# 6 2020-01-02 10:00 2020-01-02   3.5 <NA>             <NA>             <NA>            
# 7 2020-01-02 11:00 2020-01-02   4   <NA>             2020-01-02 11:00 2020-01-02 11:00
# 8 2020-01-02 12:00 2020-01-02   4.5 2020-01-02 12:00 2020-01-02 12:00 2020-01-02 12:00
# 9 2020-01-03 10:00 2020-01-03   5   <NA>             2020-01-03 10:00 2020-01-03 10:00
#10 2020-01-03 11:00 2020-01-03   5.5 <NA>             <NA>             <NA>            
 类似资料:
  • 问题内容: 我正在做一个自动化的查询。它需要查找最后一天晚上8点到晚上8点之间的所有交易。我当时正在考虑做这样的事情 对于自动查询,这很适合找出日期部分。但是变量的TIME部分是查询执行的当前时间。有没有一种快速简单的方法来将两个变量的时间部分硬编码为8:00 PM? 问题答案:

  • 问题内容: 我想用Python(不是数组)中的一个创建10个变量。像这样: 我想创建的变量名,在这种情况下: ,,,…, 我不想一个数组 我有一个坐标图(640 x 480)。我正在确定像素颜色为白色的坐标。地面上有3个球,我想获取每个球的中心坐标,因此,如果要评估的坐标距离最后一个球很近,则x和y坐标将被平均(如果该坐标属于a)新球的坐标将属于新坐标组。 问题答案: 您不应该这样做,但是如果您真

  • 当你使用了一个未知的变量名,通常 JavaScript 会自动创建全局变量: function f() { foo = 123 } f() foo 123 好在你会在 ECMAScript5 的严谨模式得到警告[1]: function f() { 'use strict'; foo = 123 } f() ReferenceError: foo is not defined 参考 [1] Jav

  • 可能重复: Java中的动态变量名: 假设我有一个字符串,如下所示。 现在,我想创建一个字符串,但是字符串的变量将被称为“Hello”。为了使字符串名为“Hello”,我必须访问string以获取名称“Hello”,这样我就可以将其用作变量名。下面是我想看的。 感谢您的努力,请尝试向我解释,因为我是Java初学者D

  • 问题内容: 我有一个包含300k条带有日期的记录的变量,并且该日期看起来像是该日期的 2015-02-21 12:08:51 我想删除时间 日期变量的类型是pandas.core.series.series 这是我尝试的方式 一些随机错误 在上面的代码中,textdata是我的数据集名称,而vfreceived date是一个由日期组成的变量。 如何编写代码以从datetime中删除时间。 问题答

  • 本文向大家介绍arduino 创建变量,包括了arduino 创建变量的使用技巧和注意事项,需要的朋友参考一下 示例 要创建变量: 例如: 要创建变量并对其进行初始化: 例如: