r - 根据一列中的最小值聚合以删除数据表中的重复项

标签 r data.table

我对R中的data.table包很陌生,data.table的版本是1.8.2。

我的数据表有大约 2100 万行,所以理想情况下我喜欢使用数据表方法来解决我的问题,因为这是当今处理大数据的方式。下面是示例数据和代码:

samp_data <- data.frame(user1 = c(24, 24, 24, 56, 75, 75),
                        user2 = c(43, 43, 57, 34, 61, 61),  
                        amount1 = c(1, 4, 3, 2, 6, 8), 
                        amount2 = c(4, 7, 9, 3, 5, 6), 
                        PURCH_DATE_1 = as.Date(c("2012-01-01", "2012-04-29", 
                        "2012-03-02", "2012-06-15", "2012-03-17", "2012-09-25")), 
                        PURCH_DATE_2 = as.Date(c("2012-04-01", "2012-01-25", 
                        "2012-05-21","2012-08-18", "2012-04-03", "2012-10-29")))
samp_data$DIFF_DAYS <- abs(as.numeric(samp_data$PURCH_DATE_1-
samp_data$PURCH_DATE_2))
samp_data_new<-data.table(samp_data)

我想取回一个包含 7 个原始列但 user1 和 user2 列中存在重复对的数据表,将保留 DIFF_DAYS 列中具有最小值的行。

假设我把你们中的一些人和我想要的搞混了,下面的代码包含了想要的输出:

samp_data_desired<-data.frame(user1=c(24,24,56,75),user2=c(43,57,34,61),
                              amount1=c(1,3,2,6),amount2=c(4,9,3,5),
                              PURCH_DATE_1=as.Date(c("2012-01-01","2012-03-02",
                              "2012-06-15","2012-03-17")),
                              PURCH_DATE_2=as.Date(c("2012-04-01","2012-05-21",
                              "2012-08-18","2012-04-03")),
                              DIFF_DAYS=c(91,80,64,17))

我知道如何使用 DT[, min(col1), by=user1] 之类的想法执行简单的聚合以找到每个 user1 的平均值、最小值和最大值,但我无法成功使用唯一或重复的函数.我试过了:

samp_data_check <- data.table(samp_data, key=c("user1", "user2", 
                            "amount1", "amount2", "PURCH_DATE_1",
                            "PURCH_DATE_2"))


samp_data_test <- samp_data_check[, unique(DIFF_DAYS), by=c("user1", 
                  "user2", "amount1", "amount2", "PURCH_DATE_1", 
                  "PURCH_DATE_2")]

伴随着一些变化,但我感到非常困惑,因此非常感谢任何帮助。

最佳答案

我能想到的第一种方法(除了将键列设置为 DIFF_DAYS 之外,与 data.table 没有太大关系)。假设您的 data.table 是 DT:

setkey(DT, "DIFF_DAYS")
DT[!duplicated(DT[, c("user1", "user2")])]

另一种方法(更多data.table):

setkey(DT, "user1", "user2", "DIFF_DAYS")
key.DT <- unique(DT[, 1:2])
DT[key.DT, mult = "first"]

关于r - 根据一列中的最小值聚合以删除数据表中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16037074/

相关文章:

r - 如何将 "..."参数传递给从 foreach() 调用的函数?

c - native C 程序中的 R.h 和 Rmath.h

r - 计算多个列中重复值的出现次数

r - 将文本从多个连接附加到单个文件的最可靠方法是什么

r - R 中的平均列对

从行中的值中删除重复项

r - R 中的 3 列数据表

r - data.tables 的 Shiny react 失败

将 data.tables 列表中的列替换为 R

r - 根据另一个 data.table 中的值更新 data.table