R除去第一次出现以外的所有事件

时间:2017-07-11 04:46:43

标签: 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:30", "08:30", "10:30", "08:30"))

我想删除所有重复id的行。如果找到重复项,那么我想保留首先发生的id(按日期和时间),并删除所有其他

我目前的做法是按date排序,然后:

df <- subset(df, duplicated(df$id) == FALSE)

因此,这将保留id不重复的所有行,但保留条件不明确。它似乎只是保持它按日期排序时遇到的第一次出现?

有没有办法做到这一点,而不必先排序日期?

4 个答案:

答案 0 :(得分:2)

你可能需要这样的东西:

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对象,将datetime列粘贴在一起,相应地arrange,并从每个组中选择第一个观察点(最早出现的一个)。

答案 1 :(得分:1)

我们需要df[!duplicated(df$id, 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(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

如果我们需要考虑日期&#39;和&#39;时间&#39; (已在示例中订购)

SkillSets[] = [];

答案 2 :(得分:1)

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

library(data.table)
unique(setDT(df, key = c("date", "time")), by = "id")
   id     date  time
1:  2 15-12-15 08:30
2:  1 15-12-15 10:30
3:  3 16-12-15 10:30

setDT()强制dfdata.table课程。 key参数对df进行排序并将其标记为已排序。

答案 3 :(得分:1)

使用index="0"的一种替代方法可以是:

<file path="catalog/model/checkout/order.php">
    <operation>
        <search trim="true">
            <![CDATA[
             $order_product_id = $this->db->getLastId();
             ]]>
        </search>
        <add position="after">
            <![CDATA[
                if($product['variation_detail_id']){
            $this->db->query("INSERT INTO `oc_order_variation`( `order_id`, `order_product_id`, `product_variation_detail_id`) VALUES (".(int)$order_id.",".(int)$order_product_id.",".(int)$product['variation_detail_id'].")");
        }
            ]]>
        </add>
    </operation>
</file>

给出:

dplyr