匹配并找到R中最早的值

时间:2015-04-07 09:41:05

标签: r

我有两张表,一张是销售历史,另一张是关键客户。

“销售历史记录”表格如下所示(包含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

4 个答案:

答案 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.所以我的答案可能对这个例子没用,但它应该作为一般帮助。