我有一个如下所示的数据框:
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
不重复的所有行,但保留条件不明确。它似乎只是保持它按日期排序时遇到的第一次出现?
有没有办法做到这一点,而不必先排序日期?
答案 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
对象,将date
和time
列粘贴在一起,相应地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()
强制df
到data.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