【问题标题】:R - Select first entry of a day (date and time) given the respective subject IDR - 给定相应的主题 ID,选择一天(日期和时间)的第一个条目
【发布时间】:2017-08-15 02:49:44
【问题描述】:

我正在尝试每天根据主题 ID 选择第一个注册条目来整理任何多个条目。

我正在处理一个非常大的数据集,所以这里只是我的数据结构的快照:

 df <- c(Contact.ID, Date.Time, Age, Gender, Attendance)

Contact.ID       Date.Time       Age   Gender   Attendance   
1   A       2012-07-06 18:54:48   37    Male         30    
2   A       2012-07-06 20:50:18   37    Male         30    
3   A       2012-08-14 20:18:44   37    Male         30   
4   B       2012-03-15 16:58:15   27  Female         40    
5   B       2012-04-18 10:57:02   27  Female         40    
6   B       2012-04-18 17:31:22   27  Female         40    
7   B       2012-04-18 18:37:00   27  Female         40    
8   C       2013-10-22 17:46:07   40    Male         5    
9   C       2013-10-27 11:21:00   40    Male         5    
10  D       2012-07-28 14:48:33   20  Female         12 

我尝试了一些不同的方法,例如:

t.first <- df[match(unique(df$Date.Time), df$Date.Time),]

setDT(df)[,.SD[which.max(df$Date.Time)],keyby=df$Contact.ID]

library(dplyr)
t.first <- ddply(df, "Date.Time", function(z) tail(z,1))

但是,在给定我的特定主题 ID 的情况下,他们都没有让我获得第一个条目。

所以最后我需要留下一个数据集:

Contact.ID       Date.Time       Age   Gender   Attendance   
1   A       2012-07-06 18:54:48   37    Male         29    
2   A       2012-08-14 20:18:44   37    Male         29   
3   B       2012-03-15 16:58:15   27  Female         38    
4   B       2012-04-18 10:57:02   27  Female         38    
5   C       2013-10-22 17:46:07   40    Male         5    
6   C       2013-10-27 11:21:00   40    Male         5    
7   D       2012-07-28 14:48:33   20  Female         12 

请,如果有人可以提供帮助,我已经被困在这个问题上太久了。

【问题讨论】:

标签: r date time


【解决方案1】:

使用 dplyr::slice() 的另一个选项。这将防止重复。

library(dplyr)
library(lubridate)

dt2 <- dt %>%
  mutate(Date.Time = ymd_hms(Date.Time)) %>%
  mutate(Date = as.Date(Date.Time)) %>%
  group_by(Contact.ID, Date) %>%
  arrange(Date.Time) %>%
  slice(1) %>%
  ungroup() %>%
  select(-Date)

【讨论】:

    【解决方案2】:

    来自dplyr 和lubridate 的解决方案。我们可以将Date.Time 转换为datetime 类,创建一个名为date 的新变量,按Contact.ID 和Date 分组,并选择每组的最小记录。 dt2 是最终输出。

    library(dplyr)
    library(lubridate)
    
    dt2 <- dt %>%
      mutate(Date.Time = ymd_hms(Date.Time)) %>%
      mutate(Date = as.Date(Date.Time)) %>%
      group_by(Contact.ID, Date) %>%
      filter(Date.Time == min(Date.Time)) %>%
      ungroup() %>%
      select(-Date)
    
    dt2
    # A tibble: 7 x 5
      Contact.ID           Date.Time   Age Gender Attendance
           <chr>              <dttm> <int>  <chr>      <int>
    1          A 2012-07-06 18:54:48    37   Male         30
    2          A 2012-08-14 20:18:44    37   Male         30
    3          B 2012-03-15 16:58:15    27 Female         40
    4          B 2012-04-18 10:57:02    27 Female         40
    5          C 2013-10-22 17:46:07    40   Male          5
    6          C 2013-10-27 11:21:00    40   Male          5
    7          D 2012-07-28 14:48:33    20 Female         12
    

    数据准备

    dt <- read.table(text = "'Contact.ID' 'Date.Time' Age Gender Attendance
    1 A '2012-07-06 18:54:48' 37 Male 30
                     2 A '2012-07-06 20:50:18' 37 Male 30
                     3 A '2012-08-14 20:18:44' 37 Male 30
                     4 B '2012-03-15 16:58:15' 27 Female 40
                     5 B '2012-04-18 10:57:02' 27 Female 40
                     6 B '2012-04-18 17:31:22' 27 Female 40
                     7 B '2012-04-18 18:37:00' 27 Female 40
                     8 C '2013-10-22 17:46:07' 40 Male 5
                     9 C '2013-10-27 11:21:00' 40 Male 5
                     10 D '2012-07-28 14:48:33' 20 Female 12",
                     header = TRUE, stringsAsFactors = FALSE)
    

    【讨论】:

    • 如果有 > 1 条记录具有相同的 Date.Time 并且 Date.Time 也恰好是最早的,则将返回多行。遥远的可能性,但只是把它放在那里。
    • 嘿!非常感谢您的回复!不幸的是,我收到此错误消息: UseMethod("mutate_") 中的错误:没有适用于 'mutate_' 的方法应用于类“函数”的对象,但其他注释有效。还是非常感谢:)
    • 我相信错误消息意味着您将 mutate 函数应用于另一个函数,但 mutate 应该应用于数据框。由于df 是R 中的预定义函数,因此您可能会在定义数据框df 之前应用我的代码。这就是为什么我通常将我的数据框命名为dt,而不是df,以避免任何混淆。
    • 为了证明我的观点,您可以在全新的 R 工作环境中运行 library(dplyr) mutate(df)。控制台应该报告相同的错误消息。你接受哪个答案并不重要,我只是想清楚我的答案应该是有效的。
    • 非常感谢您澄清这一点:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2015-01-31
    • 2012-08-16
    相关资源
    最近更新 更多