gpt4 book ai didi

r - 在R中为data.table按组查找最大值的索引

转载 作者:行者123 更新时间:2023-12-04 10:11:59 27 4
gpt4 key购买 nike

我有一个 data.table 或 data.frame,如下所示:

Name     Person     Date
A 1 1/1/2004
A 2 1/1/2004
A 2 1/3/2004
A 3 1/1/2004
A 3 1/3/2004
A 3 1/9/2004
B 4 1/7/2004
B 5 1/7/2004
B 5 1/10/2004
B 6 1/7/2004
B 6 1/10/2004
B 6 1/17/2004

在这里,我试图创建一个新的数据表,如果日期不是按人计算的最大值,则该表具有“NA”。基本上,我试图让数据表看起来像:

    Name     Person     Date
A 1 1/1/2004
A 2 "NA"
A 2 1/3/2004
A 3 "NA"
A 3 "NA"
A 3 1/9/2004
B 4 1/7/2004
B 5 "NA"
B 5 1/10/2004
B 6 "NA"
B 6 "NA"
B 6 1/17/2004

基本上,我想到的算法是按人来看每个分组。如果按人分组只有一个元素,那么那个值就是最大值,因此我们让它留在那里。但是,例如,在按人 2 分组时,最大值为 1/3/2004,因此我们将 1/1/2004 设为“NA”。

我唯一能想到的方法是按组(Person)找到最大值对应的数据表的索引,然后创建一个所有NA的新向量,然后用最大值的索引替换值。

代码如下:

which.max(data$Date, by=data$Person)

这在某种程度上对我不起作用,但不管怎样,这段代码看起来都可能是时间密集型的,尤其是当我的数据集有 1 亿行时。大型数据集是否有快速实现,尤其是在 data.table 包中工作?谢谢!

最佳答案

使用data.table:

#dat <- as.data.table(dat)
#dat$Date <- as.Date(dat$Date,format="%m/%d/%Y")
dat[dat[, Date != max(Date) , by=Person][,V1], Date := NA]
dat

# Name Person Date
#1: A 1 2004-01-01
#2: A 2 <NA>
#3: A 2 2004-01-03
#4: A 3 <NA>
#5: A 3 <NA>
#6: A 3 2004-01-09
#7: B 4 2004-01-07
#8: B 5 <NA>
#9: B 5 2004-01-10
#10: B 6 <NA>
#11: B 6 <NA>
#12: B 6 2004-01-17

关于r - 在R中为data.table按组查找最大值的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25320979/

27 4 0