R 数据操作和数据透视
我有一个事务数据集,其中与客户相关的每个事务都显示在单独的行中,如下所示:R 数据操作和数据透视,r,dataframe,pivot,pivot-table,data-manipulation,R,Dataframe,Pivot,Pivot Table,Data Manipulation,我有一个事务数据集,其中与客户相关的每个事务都显示在单独的行中,如下所示: Customer_ID Transaction_Date Amount Cust_1 20-Dec-2020 100 Cust_1 28-Dec-2020 800 Cust_1 05-Jan-2021 300 Cust_2 10-Jan-2021 200 C
Customer_ID Transaction_Date Amount
Cust_1 20-Dec-2020 100
Cust_1 28-Dec-2020 800
Cust_1 05-Jan-2021 300
Cust_2 10-Jan-2021 200
Cust_2 08-Feb-2021 300
Cust_3 15-Feb-2021 500
我试图将日期转换成不同的列,名称为“第一个日期”、“第二个日期”等,R给了我一个稀疏矩阵,每个唯一的日期分配给一个列,从而生成1000多个列
我希望通过一些计算,在不同的列中重新构造这些数据,如下所示:
Customer_ID 1st_Trans_Date 2nd_Trans_Date 3rd_Trans_Date Total_Trans Total_Amt Avg_Amt
Cust_1 20-Dec-2020 28-Dec-2020 05-Jan-2021 3 1200 400
Cust_2 10-Jan-2021 08-Feb-2021 2 500 250
Cust_3 15-Feb-2021 1 500 500
您可以计算每个客户的交易数量,并将数据重塑为宽格式
library(dplyr)
library(tidyr)
df %>%
group_by(Customer_ID) %>%
mutate(row = row_number(),
Total_Trans = n()) %>%
ungroup %>%
select(-Amount) %>%
pivot_wider(names_from = row, values_from = Transaction_Date,
names_prefix = 'Trans_Date')
# Customer_ID Total_Trans Trans_Date1 Trans_Date2 Trans_Date3
# <chr> <int> <chr> <chr> <chr>
#1 Cust_1 3 20-Dec-2020 28-Dec-2020 05-Jan-2021
#2 Cust_2 2 10-Jan-2021 08-Feb-2021 NA
#3 Cust_3 1 15-Feb-2021 NA NA
库(dplyr)
图书馆(tidyr)
df%>%
分组依据(客户ID)%>%
变异(行=行编号(),
总运输量=n())%>%
解组%>%
选择(-Amount)%%>%
透视图(名称从=行,值从=事务日期,
名称\前缀='Trans\ u Date')
#客户ID总计交易交易日期1交易日期2交易日期3
#
#1客户3 2020年12月20日2020年12月28日2021年1月5日
#2客户2 2021年1月10日2021年2月8日北美
#3客户1 2021年2月15日不适用
数据
df <- structure(list(Customer_ID = c("Cust_1", "Cust_1", "Cust_1",
"Cust_2", "Cust_2", "Cust_3"), Transaction_Date = c("20-Dec-2020",
"28-Dec-2020", "05-Jan-2021", "10-Jan-2021", "08-Feb-2021", "15-Feb-2021"
), Amount = c(100L, 800L, 300L, 200L, 300L, 500L)),
class = "data.frame", row.names = c(NA, -6L))
df这里是一个数据表
library(data.table)
# Sample data -----
DT <- fread("Customer_ID Transaction_Date Amount
Cust_1 20-Dec-2020 100
Cust_1 28-Dec-2020 800
Cust_1 05-Jan-2021 300
Cust_2 10-Jan-2021 200
Cust_2 08-Feb-2021 300
Cust_3 15-Feb-2021 500")
# Sumarise by customer
ans <- DT[, .(paste0(Transaction_Date, collapse = ";"),
Total_Trans = .N),
by = .(Customer_ID)]
# Split transactioen dates
ans[, paste0("Trans_Date", 1:length(tstrsplit(ans$V1, ";"))) := tstrsplit(V1, ";")][,V1 := NULL]
# Customer_ID Total_Trans Trans_Date1 Trans_Date2 Trans_Date3
# 1: Cust_1 3 20-Dec-2020 28-Dec-2020 05-Jan-2021
# 2: Cust_2 2 10-Jan-2021 08-Feb-2021 <NA>
# 3: Cust_3 1 15-Feb-2021 <NA> <NA>
库(data.table)
#样本数据-----
DT为了完整性,一个实际产生OP要求的列的解决方案:
数据%
变异(
TxNo=paste0(sapply(seq(n()),toOrdinal),“\u Trans\u Date”),
Total_Trans=n(),
总金额=总和(金额),
平均金额=平均值(金额)
)
数据%>%pivot\u更宽(
id\u cols=c(“客户id”、“总交易”、“总金额”、“平均金额”),
名称_from=TxNo,
值\u from=事务\u日期)%>%print.data.frame
输出:
Customer_ID Total_Trans Total_Amt Avg_Amt 1st_Trans_Date 2nd_Trans_Date 3rd_Trans_Date
1 Cust_1 3 1200 400 20-Dec-2020 28-Dec-2020 05-Jan-2021
2 Cust_2 2 500 250 10-Jan-2021 08-Feb-2021 <NA>
3 Cust_3 1 500 500 15-Feb-2021 <NA> <NA>
客户ID总额交易总额平均金额第一交易日期第二交易日期第三交易日期
1客户1 3 1200 400 20-Dec-2020 28-Dec-2020 05-Jan-2021
2客户2 2500 250 2021年1月10日2021年2月8日
3客户3 1500 500 2021年2月15日
请修复表的格式,它们在当前表单中无法读取。有关如何做事情的信息。欢迎访问SO。请阅读并始终尝试发布您的数据的实际代码,并尝试。非常感谢您的指导。这确实帮助我清楚地了解了R中数据操作的工作原理,并且有助于解决我遇到的问题。感谢你的帮助Ronak。我们将尝试这个并检查结果。