【问题标题】:Sort data with tidyverse based on criteria根据标准使用 tidyverse 对数据进行排序
【发布时间】:2020-10-09 07:27:04
【问题描述】:

我有一个由两列组成的数据框:ID 和 date_time。 ID 表示谁正在被记录,而 date_time 表示何时。请参阅下面的数据框。

我想根据这个数据框计算一个新的数据框,它包含三列:“Measurement”、“ID”和“Date”。

  1. “测量”。此列应说明这是给定 ID 的数字测量值。测量从 23:00:00 开始,然后一直运行到第二天的 22:59:59。然而,测量在随机时间开始,因此第一次测量的持续时间不是 24 小时。最后一次测量也不是 24 小时。
  2. “身份证”。指明给定测量的 ID
  3. “日期”。此列应显示给定测量中最后一次记录的日期,格式为:yyyy.mm.dd。

每个唯一测量值都应该有一行

structure(list(date_time = c("2020.03.02 22:00:17", "2020.03.02 22:05:17", 
"2020.03.02 22:10:17", "2020.03.02 22:35:17", "2020.03.02 22:40:17", 
"2020.03.02 22:45:17", "2020.03.02 22:50:17", "2020.03.02 22:55:17", 
"2020.03.02 23:00:17", "2020.03.02 23:05:17", "2020.03.02 23:10:17", 
"2020.03.02 23:15:17", "2020.03.02 23:20:17", "2020.03.02 23:25:17", 
"2020.03.02 23:30:17", "2020.03.02 23:35:17", "2020.03.02 23:40:17", 
"2020.03.02 23:45:17", "2020.03.02 23:50:17", "2020.03.02 23:55:17", 
"2020.03.03 00:00:17", "2020.03.03 00:55:17", "2020.03.03 01:00:17", 
"2020.03.03 01:05:17", "2020.03.03 01:10:17", "2020.03.03 01:15:17", 
"2020.03.03 01:20:17", "2020.03.03 01:25:17", "2020.05.09 08:39:32", 
"2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32", 
"2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32", 
"2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32", 
"2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32", 
"2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32", 
"2020.05.09 08:39:32", "2020.05.09 08:39:32"), id = c(12L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 
13L, 13L, 13L, 13L, 13L)), row.names = c(NA, 46L), class = "data.frame")
#Expected output:
output <- read.table(header=TRUE, text ="
                     ID Date        Measurement
                     12 2020.03.02  1
                     12 2020.03.03  2
                     13 2020.05.09  1
")  

我是 R 新手,并尝试使用 tidyverse。 非常感谢所有帮助,谢谢!

【问题讨论】:

  • 你能分享预期的输出吗?另外,列 ID 是指“案例”列吗?
  • 感谢您的评论!我可以看到我的问题在几个方面都不清楚。我已经尝试改进它。如果仍有任何不清楚的地方,请告诉我。
  • 在您的问题中您说您的预期输出有 3 列,但在您显示的预期输出中只有两列。你能让它保持一致吗?此外,目前我还不清楚什么是测量值以及您希望看到的数字。
  • 是的,我可以看到我的问题仍然不清楚。我已经编辑了文本以使其更清晰。感谢您解决这个问题。
  • 您的问题仍然不清楚如何获得测量值。您在上面发布的示例数据是您在底部显示的预期输出吗?那么您不符合您的标准 #3,因为它不是 ID 13 的“最后录制日期”。

标签: r tidyverse


【解决方案1】:

假设 df1 是您的数据框,另一种方法是......

df1$dateTime = as_datetime(df1$date_time, format = "%Y.%m.%d %H:%M:%S")
df1$mydate = as.Date(df1$date_time, format = "%Y.%m.%d %H:%M:%S")

df1$tm <- as.numeric(df1$dateTime)
df1$dts <- 86400*as.numeric(df1$mydate)

df2 <- df1 %>% group_by(id,mydate) %>% 
         transform(date = case_when(((dts-3600)<tm & tm<(dts+82800) )~paste0(mydate),((dts+82800)<=tm)~paste0(mydate+1) )) %>% 
         select(id,date) %>%   unique() %>% 
         group_by(id) %>% mutate(measurement = row_number())
df2

>df2
# A tibble: 3 x 3
# Groups:   id [2]
     id date       measurement
  <int> <chr>            <int>
1    12 2020-03-02           1
2    12 2020-03-03           2
3    13 2020-05-09           1

【讨论】:

    【解决方案2】:

    我确信有更好的方法可以做到这一点,但是.....

    library(tidyverse)
    
    df <- data.frame(
      structure(list(date_time = c("2020.03.02 22:00:17", "2020.03.02 22:05:17", 
                                   "2020.03.02 22:10:17", "2020.03.02 22:35:17", "2020.03.02 22:40:17", 
                                   "2020.03.02 22:45:17", "2020.03.02 22:50:17", "2020.03.02 22:55:17", 
                                   "2020.03.02 23:00:17", "2020.03.02 23:05:17", "2020.03.02 23:10:17", 
                                   "2020.03.02 23:15:17", "2020.03.02 23:20:17", "2020.03.02 23:25:17", 
                                   "2020.03.02 23:30:17", "2020.03.02 23:35:17", "2020.03.02 23:40:17", 
                                   "2020.03.02 23:45:17", "2020.03.02 23:50:17", "2020.03.02 23:55:17", 
                                   "2020.03.03 00:00:17", "2020.03.03 00:55:17", "2020.03.03 01:00:17", 
                                   "2020.03.03 01:05:17", "2020.03.03 01:10:17", "2020.03.03 01:15:17", 
                                   "2020.03.03 01:20:17", "2020.03.03 01:25:17", "2020.05.09 08:39:32", 
                                   "2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32", 
                                   "2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32", 
                                   "2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32", 
                                   "2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32", 
                                   "2020.05.09 08:39:32", "2020.05.09 08:39:32", "2020.05.09 08:39:32", 
                                   "2020.05.09 08:39:32", "2020.05.09 08:39:32"), id = c(12L, 12L, 
                                                                                         12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
                                                                                         12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
                                                                                         13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 
                                                                                         13L, 13L, 13L, 13L, 13L)), row.names = c(NA, 46L), class = "data.frame")
    )
    
    df %>%
      mutate(
        date_time = anytime::anydate(date_time)
      ) %>%
      group_by(id) %>% summarise(date = unique(date_time)) %>%
      mutate(
        Measurement = 1,
        Measurement = cumsum(Measurement)
      )
    
    # A tibble: 3 x 3
    # Groups:   id [2]
         id date       Measurement
      <int> <date>           <dbl>
    1    12 2020-03-02           1
    2    12 2020-03-03           2
    3    13 2020-05-09           1
    

    【讨论】:

    • 谢谢,这个解决方案似乎也很好用!
    • @Magnus,如果ID 14 具有"2020.03.02 23:45:17", "2020.03.02 23:50:17", "2020.03.02 23:55:17", "2020.03.03 00:00:17", "2020.03.03 00:55:17", "2020.03.03 01:00:17" 的测量值,则应根据您的标准#1 计算一次。但是,此解决方案将其计为两个 (1, 2) 测量值,类似于 ID 12 的计数。
    • 是的,你是对的!但是,您的解决方案可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 2019-09-24
    • 2012-08-24
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多