我有两张表,一张是销售历史,另一张是关键客户。
“销售历史记录”表格如下所示(包含500,000行):
Client No. Transaction Date Sales Amount
abc 1/12/2014 100
def 2/28/2014 200
hij 3/01/2014 300
abc 2/18/2014 400
abc 5/26/2014 500
xyz 7/15/2014 600
def 8/23/2014 700
hij 9/19/2014 800
Key Clients表如下所示:
Client No.
abc
def
xyz
现在我想用R做的是,基于Key Clients表,我需要创建一个与Sales History表中最早的Sales Amount匹配的新表。期望的结果如下所示:
Client No. Earliest Sales Amount
abc 100
def 200
xyz 600
答案 0 :(得分:3)
如果订购了“交易日期”列,那么我们可以使用match
df2$EarliestSalesAmount <- df1[,3][match(df2[,1], df1[,1])]
或者我们可以在将密钥设置为“Client_No”后使用data.table
来加入两个数据集。 order
转换为'Date'类后使用'Transaction_Date',按'Client_No'选择第一行(.SD[1L]
),将不需要的列分配到NULL
,并相应地更改列名(setnames
)
library(data.table)
res <- setkey(setDT(df1), Client_No.)[df2][order(as.Date(Transaction_Date,
format='%m/%d/%Y')),.SD[1L] ,Client_No.][, 2:= NULL]
setnames(res, 2, 'Earliest_Sales_Amount')
# Client_No. Earliest_Sales_Amount
#1: abc 100
#2: def 200
#3: xyz 600
df1 <- structure(list(Client_No. = c("abc", "def", "hij", "abc",
"abc",
"xyz", "def", "hij"), Transaction_Date = c("1/12/2014", "2/28/2014",
"3/01/2014", "2/18/2014", "5/26/2014", "7/15/2014", "8/23/2014",
"9/19/2014"), Sales_Amount = c(100L, 200L, 300L, 400L, 500L,
600L, 700L, 800L)), .Names = c("Client_No.", "Transaction_Date",
"Sales_Amount"), class = "data.frame", row.names = c(NA, -8L))
df2 <- structure(list(Client_No. = c("abc", "def", "xyz")),
.Names = "Client_No.", class = "data.frame", row.names = c(NA, -3L))
答案 1 :(得分:3)
我还建议您使用data.table
二进制加入,但我会将.EACHI
用于此
library(data.table)
setkey(setDT(df)[, Transaction.Date := as.IDate(Transaction.Date, "%m/%d/%Y")], Client.No.)
df[key, .(Earliest.Sales.Amont = Sales.Amount[which.min(Transaction.Date)]), by = .EACHI]
# Client.No. Earliest.Sales.Amont
# 1: abc 100
# 2: def 200
# 3: xyz 600
首先,我们会使用df
将您的数据集(data.table
)转换为setDT
类,将Transaction.Date
转换为Date
类,这样R就会在查找最小日期时理解您的意思,然后按Client.No.
键入它以执行二进制连接(这对于大数据非常有效像你一样设置)。然后,在密钥表(key
)上执行二进制连接时,我们将使用by = .EACHI
来查找数据中最早日期内的Sale.Amount
集。
答案 2 :(得分:2)
如何使用'dplyr',如下所示? (未经过测试,使用一些更易于输入的标签)
sal_hist_first <- sales_hist %>%
mutate(trans_date=as.Date(trans_date, format="%m/%d/%Y")) %>%
group_by(client_no) %>%
summarise(earliest_sales_amount = sales_amount[trans_date == min(trans_date)])
result <- keys_clients %>% left_join(sal_hist_first)
答案 3 :(得分:2)
为了给出更详细的答案,了解所使用的编程语言/ IDE和精确的数据库系统将是有用的。
但假设您使用MySQL,MSSQL或PostgreSQL之类的东西,并且您能够执行SQL语句,以下内容应该让您知道该怎么做。
首先,您可以打开按交易日期排序的销售历史记录表。然后,您可以遍历它以查找相应的密钥客户端。 或者,如果您的数据库允许使用TOP语句,则可以为每个密钥客户端使用以下SQL语句:
SELECT TOP 1 Client_No, Sales_Amount FROM tbl_sales_history WHERE Client_No = '<KEY CLIENT>' ORDER BY Transaction_Date
此SQL语句将返回由事务日期排序的所有记录的关键客户端的第一条记录。这当然是最早的销售。
简而言之,问题是按交易日期订购销售历史记录。
编辑:刚看到使用的编程语言是R.所以我的答案可能对这个例子没用,但它应该作为一般帮助。