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。我们将尝试这个并检查结果。