R删除除第一次出现以外的所有内容

R删除除第一次出现以外的所有内容,r,sorting,dataframe,subset,R,Sorting,Dataframe,Subset,我有一个如下所示的数据帧: id date time 1 1 15-12-15 10:30 2 2 15-12-15 08:30 3 3 16-12-15 10:30 4 1 16-12-15 08:30 df <- data.frame(id=c(1,2,3,1), date=c("15-12-15", "15-12-15", "16-12-15", "16-12-15"), time=c("10

我有一个如下所示的数据帧:

  id     date  time
1  1 15-12-15 10:30
2  2 15-12-15 08:30
3  3 16-12-15 10:30
4  1 16-12-15 08:30
df <- data.frame(id=c(1,2,3,1),
                 date=c("15-12-15", "15-12-15", "16-12-15", "16-12-15"),
                 time=c("10:30", "08:30", "10:30", "08:30"))
可以这样创建:

  id     date  time
1  1 15-12-15 10:30
2  2 15-12-15 08:30
3  3 16-12-15 10:30
4  1 16-12-15 08:30
df <- data.frame(id=c(1,2,3,1),
                 date=c("15-12-15", "15-12-15", "16-12-15", "16-12-15"),
                 time=c("10:30", "08:30", "10:30", "08:30"))
因此,这将保留id不重复的所有行,但保留条件不明确。它似乎只保留了按日期排序时遇到的第一个事件

有没有一种方法可以做到这一点而不必首先进行日期排序?

我们需要fromLast=TRUE

如果我们需要考虑在例子

中已经排序的“日期”和“时间”
library(lubridate)
df[!duplicated(df$id[with(df, order(id, ymd_hm(paste(date, time))))], fromLast = TRUE),]
#    id     date  time
#2  2 15-12-15 08:30
#3  3 16-12-15 10:30
#4  1 16-12-15 08:30
我们需要fromLast=TRUE

如果我们需要考虑在例子

中已经排序的“日期”和“时间”
library(lubridate)
df[!duplicated(df$id[with(df, order(id, ymd_hm(paste(date, time))))], fromLast = TRUE),]
#    id     date  time
#2  2 15-12-15 08:30
#3  3 16-12-15 10:30
#4  1 16-12-15 08:30

你可能需要这样的东西:

library(dplyr)
df %>%
   group_by(id) %>%
   mutate(datetime = as.POSIXct(paste(date, time), format = "%d-%m-%y %H:%M")) %>%
   arrange(datetime) %>%
   slice(1) %>%
   select(-datetime)


#     id     date   time           
#  <dbl>   <fctr> <fctr>           
#1     1 15-12-15  10:30 
#2     2 15-12-15  08:30 
#3     3 16-12-15  10:30 

我们创建一个POSIXct对象,将日期和时间列粘贴在一起,相应地排列它们,并从每组中选择最早出现的第一个观测值

您可能需要这样的东西:

library(dplyr)
df %>%
   group_by(id) %>%
   mutate(datetime = as.POSIXct(paste(date, time), format = "%d-%m-%y %H:%M")) %>%
   arrange(datetime) %>%
   slice(1) %>%
   select(-datetime)


#     id     date   time           
#  <dbl>   <fctr> <fctr>           
#1     1 15-12-15  10:30 
#2     2 15-12-15  08:30 
#3     3 16-12-15  10:30 
我们创建一个POSIXct对象,将日期和时间列粘贴在一起,相应地排列它们,并从每组中选择最早出现的第一个观测值

data.table包含一个增强的unique函数,该函数接受一个by参数来指定用于唯一性检查的列:

library(data.table)
unique(setDT(df, key = c("date", "time")), by = "id")
setDT将df强制为data.table类。键参数对df进行排序并将其标记为已排序。

data.table包含一个增强的unique函数,该函数接受by参数以指定用于唯一性检查的列:

library(data.table)
unique(setDT(df, key = c("date", "time")), by = "id")
setDT将df强制为data.table类。关键参数对df进行排序并将其标记为已排序。

使用dplyr的一种替代方法可以是:

其中:

     id     date   time
  <dbl>   <fctr> <fctr>
1     2 15-12-15  08:30
2     1 15-12-15  10:30
3     3 16-12-15  10:30
使用dplyr的一个备选方案可以是:

其中:

     id     date   time
  <dbl>   <fctr> <fctr>
1     2 15-12-15  08:30
2     1 15-12-15  10:30
3     3 16-12-15  10:30