首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据过去48小时内发生的情况改变值?

根据过去48小时内发生的情况改变值?
EN

Stack Overflow用户
提问于 2022-01-04 23:58:13
回答 1查看 33关注 0票数 1

我有一个数据集,需要将任何值都更改为0,但在过去48小时中有一个非零的值更改为一个特定的字符串。在执行此操作之前,我可能需要将dbl中的第一列转换为chr吗?

代码语言:javascript
运行
复制
   Time                 colA             colB             colC  colD
   <dttm>              <dbl>            <dbl>            <dbl> <dbl>
 1 2021-11-21 10:00:00     8                0                9   176
 2 2021-11-11 11:00:00    21                0               22   416
 3 2021-11-21 11:00:00    19                0               20   373
 4 2021-11-11 12:00:00    40               13               28   566
 5 2021-11-21 12:00:00    26                0               27   527
 6 2021-11-11 13:00:00    50               20               32   651
 7 2021-11-11 10:00:00    11                0               12   216
 8 2021-11-21 13:00:00    30                0               31   617
 9 2021-11-11 14:00:00    51                0               32   675
10 2021-11-21 14:00:00    31                0               32   644

很抱歉,数据还没有按时间进行排序,正在进行修复。例如,下面是我想要得到的输出:

代码语言:javascript
运行
复制
   Time                 colA             colB             colC  colD
   <dttm>              <dbl>            <dbl>            <dbl> <dbl>
 1 2021-11-21 10:00:00     8                0                9   176
 2 2021-11-11 11:00:00    21                0               22   416
 3 2021-11-21 11:00:00    19                0               20   373
 4 2021-11-11 12:00:00    40               13               28   566
 5 2021-11-21 12:00:00    26                0               27   527
 6 2021-11-11 13:00:00    50               20               32   651
 7 2021-11-11 10:00:00    11                0               12   216
 8 2021-11-21 13:00:00    30                0               31   617
 9 2021-11-11 14:00:00    51          STRING1               32   675
10 2021-11-21 14:00:00    31                0               32   644

由于colB的值在2021-11-11 :00:00时为0,但在此之前的48小时内至少有一个以前的值,因此它被更改为"STRING1“。

很抱歉,如果这让人感到困惑,我正在尝试在Excel中自动执行一些我通常手工做的事情。提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-05 00:50:02

这是一个潮汐的解决方案。我将首先创建一些示例数据(注意,我确实将其他列设置为字符):

代码语言:javascript
运行
复制
data = tribble(
  ~ time, ~ colA, ~ colB,
  "2021-11-21 12:00:00", 1, 0,
  "2021-11-22 00:00:00", 0, 1,
  "2021-11-24 12:00:00", 0, 0,
  "2021-11-25 12:00:00", 1, 1,
  "2021-11-26 12:00:00", 0, 0,
) %>%
  mutate(
    time = ymd_hms(time), 
    across(-time, as.character)
  )

# A tibble: 5 x 3
  time                colA  colB 
  <dttm>              <chr> <chr>
1 2021-11-21 12:00:00 1     0    
2 2021-11-22 00:00:00 0     1    
3 2021-11-24 12:00:00 0     0    
4 2021-11-25 12:00:00 1     1    
5 2021-11-26 12:00:00 0     0    

这个问题的挑战是,每一次,我们都需要知道要寻找哪些其他行来确定每一列的新值。为此,我将使用purrr:pmap()dplyr中可用的.data对象。首先,我将演示如何在过去48小时内“回顾”一段时间内的行:

代码语言:javascript
运行
复制
data %>%
  mutate(
    across(
      .cols = -time, 
      function(col) {
        pmap_chr(list(time), function(t) {
          eligible = .data$time >= t - hours(48) & .data$time < t
          paste(col[eligible], collapse = ",")
        })
      },
      .names = "{.col}_previous"
    )
  )

输出:

代码语言:javascript
运行
复制
# A tibble: 5 x 5
  time                colA  colB  colA_previous colB_previous
  <dttm>              <chr> <chr> <chr>         <chr>        
1 2021-11-21 12:00:00 1     0     ""            ""           
2 2021-11-22 00:00:00 0     1     "1"           "0"          
3 2021-11-24 12:00:00 0     0     ""            ""           
4 2021-11-25 12:00:00 1     1     "0"           "0"          
5 2021-11-26 12:00:00 0     0     "0,1"         "0,1"    

正如你所看到的,这看起来很有希望。我们已经准备好开发解决方案,以这为核心思想。

代码语言:javascript
运行
复制
data %>%
  mutate(
    across(
      .cols = -time, 
      function(col) {
        modify_ind = pmap_lgl(list(time), function(t) {
          eligible = .data$time >= t - hours(48) & .data$time < t
          any(col[eligible] != "0")
        })
        ifelse(modify_ind & col == "0", "STRING1", col)
      }
    )
  )

输出:

代码语言:javascript
运行
复制
# A tibble: 5 x 3
  time                colA    colB   
  <dttm>              <chr>   <chr>  
1 2021-11-21 12:00:00 1       0      
2 2021-11-22 00:00:00 STRING1 1      
3 2021-11-24 12:00:00 0       0      
4 2021-11-25 12:00:00 1       1      
5 2021-11-26 12:00:00 STRING1 STRING1

一些注意事项:

在我的解决方案中,

  • 创建了一个基于前面显示的思想的modify_ind:访问在过去48小时内过滤过的列,然后检查是否有任何非零值。然后,当列的值为"0".
  • If (您希望创建新列而不是完全替换原始列)时,我将修改该列,如前面所示,向across()添加一个.names参数。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70586373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档