[英]R - subsetting DF using with() and by()
今天是我參加R的第一天-您的建議會走很長一段路。
我正在嘗試根據預訂活動創建用戶的匯總視圖。
在預訂表中提取唯一的CustID。 為客戶創建新的DF。
customer <- with(BookingsDF,data.frame(CustID=sort(unique(CustID))))
將客戶已處理的次數添加到客戶表中的每個CustID。
customer <- cbind(customer, NumberOrders = with(BookingsDF,
as.numeric (by (id, CustID, function(x) length(unique(x))))))
這會生成一條錯誤消息
data.frame(...,check.names = FALSE)中的錯誤:參數暗示不同的行數:373545、391910
這沒有道理-2個查詢如何輸出不同的長度? 考慮到第一個查詢提取了唯一的CustID,第二個查詢提取了每個唯一的CustID預訂的次數。
謝謝。
最后:謝謝您的幫助。 我已將代碼更新為:
customer <- booked.dt[,{
FirstPurchaseDate = .SD[which.min(CreatedDate)]
LastPurchaseDate = .SD[which.max(CreatedDate)]
NumberOrders = .N
TotalAmount = sum(Price)
} , by = CustID]
不幸的是,這花費了很長時間。 因此,我必須通過SQL進行操作,然后將匯總數據上傳到R。
有許多軟件包可以解決此問題。 我更喜歡data.table
。 基本思想是拆分,計算和重新加入。 聲明一個data.table
,然后計算每個唯一客戶ID的行數並將其存儲在customer
。
在此示例中,請嘗試此
library(data.table)
bookings.DT <- data.table(BookingsDF)
customer <- bookings.DT[,.N,by="CustID"]
並且您應該在customer
看到一個CustID
和N
的表。 這假定數據為長格式。 如果沒有,請參見reshape2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.