我是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")]
以及一些变化,但我感到非常困惑,所以任何帮助将不胜感激。
答案 0 :(得分:6)
我能想到的第一种方式(与data.table
没什么关系,除了将关键列设置为DIFF_DAYS
)。假设您的data.table
是DT:
setkey(DT, "DIFF_DAYS")
DT[!duplicated(DT[, c("user1", "user2"), with = FALSE])]
另一种方法(更多data.table
):
setkey(DT, "user1", "user2", "DIFF_DAYS")
key.DT <- unique(DT[, 1:2, with = FALSE])
DT[key.DT, mult = "first"]