gpt4 book ai didi

R dplyr 到数据表 - 分组和过滤

转载 作者:行者123 更新时间:2023-12-04 11:57:32 25 4
gpt4 key购买 nike

出于速度原因,我正在尝试将我的数据操作代码从 dplyr 转换为 data.table。我快到了,但错过了最后一步。

我有一些示例数据来复制我的问题。

c_dt = data.table(u_id=rep(c("u1", "u2"),each=5),
p_id=c("p1", "p1", "p1", "p2","p2", "p1", "p2", "p2", "p2", "p2" ),
c_dt=c("2015-12-01", "2015-12-02", "2015-12-03", "2015-12-02",
"2015-12-05", "2015-12-02", "2015-12-03", "2015-12-04",
"2015-12-05", "2015-12-06"))

我希望找出 u_idp_id 重复的行;并只保留 c_dt 最小的行(基本上保留第一个实例)。为此,我使用以下 dplyr 代码:

c_df <- as.data.frame(c_dt)
cdedup_df <- c_df %>% group_by(p_id, u_id) %>% filter(c_dt == min(c_dt))

给出以下输出

> cdedup_df
Source: local data frame [4 x 3]
Groups: p_id, u_id

u_id p_id c_dt
1 u1 p1 2015-12-01
2 u1 p2 2015-12-02
3 u2 p1 2015-12-02
4 u2 p2 2015-12-03

我有以下 data.table 代码可以正确识别所需的行,但我无法弄清楚如何过滤和行。

cdedup_dt <- c_dt[,c_dt == min(c_dt),by = list(u_id, p_id)]
cdedup_dt
u_id p_id V1
1: u1 p1 TRUE
2: u1 p1 FALSE
3: u1 p1 FALSE
4: u1 p2 TRUE
5: u1 p2 FALSE
6: u2 p1 TRUE
7: u2 p2 TRUE
8: u2 p2 FALSE
9: u2 p2 FALSE
10: u2 p2 FALSE

最佳答案

低于我的方法。我希望它可以更好地扩展大数据集,因为 group 没有 min,只需对 data.table 进行非常高效的单次排序,然后按组先进行子集排序。

setorderv(c_dt, "c_dt")[, .SD[1L], .(u_id, p_id)]
# in data.table 1.9.7+ you can also use `head`
setorderv(c_dt, "c_dt")[, head(.SD, 1L), .(u_id, p_id)]

以下代码包括对当前其他答案的验证。
如果 OP 将提供大数据集,我可以添加基准。

library(data.table)
c_dt = data.table(u_id=rep(c("u1", "u2"),each=5), p_id=c("p1", "p1", "p1", "p2","p2", "p1", "p2", "p2", "p2", "p2" ), c_dt=c("2015-12-01", "2015-12-02", "2015-12-03", "2015-12-02", "2015-12-05", "2015-12-02", "2015-12-03", "2015-12-04", "2015-12-05", "2015-12-06"))

zero = c_dt[, list(c_dt=min(c_dt)), by=list(u_id, p_id)]
ananda = c_dt[, list(c_dt = c_dt[c_dt == min(c_dt)]), by = .(u_id, p_id)]
tal = c_dt[, .SD[rank(c_dt, ties.method = c("first")) == 1],by = .(u_id, p_id)]
all.equal(zero, ananda)
#[1] TRUE
all.equal(ananda, tal)
#[1] TRUE

jan = setorderv(c_dt, "c_dt")[, .SD[1L], .(u_id, p_id)]
all.equal(tal, jan)
#[1] TRUE

关于R dplyr 到数据表 - 分组和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34557917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com