我的数据框看起来像这样,我想要两个单独的累积列,一个用于基金A,另一个用于基金B.
Name Event SalesAmount Fund Cum-A(desired) Cum-B(desired)
John Webinar NA NA NA NA
John Sale 1000 A 1000 NA
John Sale 2000 B 1000 2000
John Sale 3000 A 4000 2000
John Email NA NA 4000 2000
Tom Webinar NA NA NA NA
Tom Sale 1000 A 1000 NA
Tom Sale 2000 B 1000 2000
Tom Sale 3000 A 4000 2000
Tom Email NA NA 4000 2000
I have tried:
df<-
df %>%
group_by(Name)%>%
mutate(Cum-A = as.numeric(ifelse(Fund=="A",cumsum(SalesAmount),0)))%>%
mutate(Cum-B = as.numeric(ifelse(Fund=="B",cumsum(SalesAmount),0))) …
Run Code Online (Sandbox Code Playgroud) 我有一个大型数据帧(3M +行).我试图计算某个ActivityType在21天窗口中出现的次数.我已经用R中的另一个变量的Rolling Sum建模了我的解决方案.但是只需要一个ActivityType就需要很长时间.我认为3M +行不会占用过多的时间.以下是我的尝试:
dt <- read.table(text='
Name ActivityType ActivityDate
John Email 1/1/2014
John Email 1/3/2014
John Webinar 1/5/2014
John Webinar 1/20/2014
John Webinar 3/25/2014
John Email 4/1/2014
John Email 4/20/2014
Tom Email 1/1/2014
Tom Webinar 1/5/2014
Tom Webinar 1/20/2014
Tom Webinar 3/25/2014
Tom Email 4/1/2014
Tom Email 4/20/2014
', header=T, row.names = NULL)
library(data.table)
library(reshape2)
dt$ActivityType <- factor(dt$ActivityType)
dt$ActivityDate <- as.Date(dt$ActivityDate, "%m/%d/%Y")
dt <- dt[order(dt$Name, dt$ActivityDate),]
dt <- dcast(dt, Name + ActivityDate ~ ActivityType, fun.aggregate=length)
setDT(dt)
#Build …
Run Code Online (Sandbox Code Playgroud) 这就是我的数据表的样子:
library(data.table)
dt <- fread('
Product Group LastProductOfPriorGroup
A 1 NA
B 1 NA
C 2 B
D 2 B
E 2 B
F 3 E
G 3 E
')
Run Code Online (Sandbox Code Playgroud)
该LastProductOfPriorGroup
列是我想要的列.我正在尝试从前一组的最后一行获取产品.所以在前两行中,没有先前的组,因此它是NA
.在第三行中,前一组1的最后一行中的产品是B
.我试图通过这个来实现这个目标
dt[,LastGroupProduct:= shift(Product,1), by=shift(Group,1)]
Run Code Online (Sandbox Code Playgroud)
无济于事.
这就是我的数据框架的样子.最右边的两列是我想要的列.我计算每行的唯一FundTypes的累计数量.第4列是所有"ActivityType"的累积唯一计数,第5列是仅"ActivityType =="Sale"的累积唯一计数.
dt <- read.table(text='
Name ActivityType FundType UniqueFunds(AllTypes) UniqueFunds(SaleOnly)
John Email a 1 0
John Sale a;b 2 2
John Webinar c;d 4 2
John Sale b 4 2
John Webinar e 5 2
John Conference b;d 5 2
John Sale b;e 5 3
Tom Email a 1 0
Tom Sale a;b 2 2
Tom Webinar c;d 4 2
Tom Sale b 4 2
Tom Webinar e 5 2
Tom Conference b;d 5 2
Tom Sale b;e;f 6 4 …
Run Code Online (Sandbox Code Playgroud) 以下是我的dataframe/data.table的样子.该rank
列是我想要的计算字段.
library(data.table)
df <- fread('
Name Score Date Rank
John 42 1/1/2018 3
Rob 85 12/31/2017 2
Rob 89 12/26/2017 1
Rob 57 12/24/2017 1
Rob 53 08/31/2017 1
Rob 72 05/31/2017 2
Kate 87 12/25/2017 1
Kate 73 05/15/2017 1
')
df[,Date:= as.Date(Date, format="%m/%d/%Y")]
Run Code Online (Sandbox Code Playgroud)
我试图在30天窗口内的数据中计算每个学生在每个给定时间点的等级.为此,我需要在给定的时间点获取所有学生的最新分数,然后通过等级函数.
在第1行,为的1/1/2018
,John
已经在过去30天的窗口,两个竞争对手:罗布与最近的得分85
在12/31/2017
和凯特与最近的得分87
在12/25/2017
和这两个日期都落在内1/1/2018 - 30
天的窗口.约翰3
得分最低42
.如果只有一名学生date(at a given row) - 30 day window
,则排名为1. …
以下是我的数据框的样子。Expected_Output
是我想要的/目标列。
Group Value1 Value2 Expected_Output
0 1 3 9 True
1 1 7 6 True
2 1 9 7 True
3 2 3 8 False
4 2 8 5 False
5 2 7 6 False
Run Code Online (Sandbox Code Playgroud)
如果任何 Value1 == 7
AND如果在给定内有任何 ,那么我想返回。Value2 == 9
Group
True
我试过无济于事:
df['Expected_Output']= df.groupby('Group').Value1.isin(7) & df.groupby('Group').Value2.isin(9)
Run Code Online (Sandbox Code Playgroud)
注意:- 可以输出真/假或 1/0。
这就是我的数据帧的样子.最右边的列("TimeForLevelChange")是我想要的列.当给定名称的级别更改时,我想从先前级别获取最小日期,并从发生级别更改的行中取出日期并计算差异.所以在第三排,约翰的等级从1变为2,他在等级1中花了16天(2016-01-17 - 2016-01-01),然后换到等级2.
library(data.table)
dt <- fread('
Name Level Date RecentLevelChange TimeForLevelChange
John 1 2016-01-01 NA NA
John 1 2016-01-10 NA NA
John 2 2016-01-17 1->2 16
John 2 2016-01-18 NA NA
John 3 2016-01-22 2->3 5
John 4 2016-01-26 3->4 4
John 4 2016-01-27 NA NA
John 7 2016-01-29 4->7 3
Tom 1 2016-01-10 NA NA
Tom 2 2016-01-17 1->2 7
Tom 2 2016-01-18 NA NA
Tom 3 2016-01-22 2->3 5
Tom 4 2016-01-26 3->4 4
Tom 4 2016-01-27 …
Run Code Online (Sandbox Code Playgroud) 这就是我的数据框架的样子.最右边(第4列)是我想要的列.对于一个给定的名字,我试图从7天前得出那个人的得分.如果7天前没有确切的日期存在,那么我希望与最接近的日期相关联的分数(行的日期 - 7天).
library(data.table)
dt <- fread('
Name Score Date ScoreAround7DaysAgo
John 9 2016-01-01 NA
John 6 2016-01-10 9
John 3 2016-01-17 6
John 5 2016-01-18 6
Tom 9 2016-01-01 NA
Tom 6 2016-01-10 9
Tom 3 2016-01-17 6
Tom 5 2016-01-18 6
')
dt[, Date := as.IDate(Date)]
Run Code Online (Sandbox Code Playgroud)
我试着dt[dt,roll=7+nearest]
无济于事.谢谢您的帮助.
这就是我的数据框架的样子.最右边的列("FullCycle")是我想要的列.对于给定的名称和在给定的时间点,我想看到一个人的整个水平变化周期.
library(data.table)
dt <- fread('
Name Level Date RecentLevelChange FullCycle
John 1 2016-01-01 NA 1
John 1 2016-01-10 NA 1
John 2 2016-01-17 1->2 1->2
John 2 2016-01-18 NA 1->2
John 3 2016-01-19 2->3 1->2->3
John 4 2016-01-20 3->4 1->2->3->4
John 4 2016-01-21 NA 1->2->3->4
John 7 2016-01-22 4->7 1->2->3->4->7
Tom 1 2016-01-10 NA 1
Tom 2 2016-01-17 1->2 1->2
Tom 2 2016-01-18 NA 1->2
Tom 3 2016-01-19 2->3 1->2->3
Tom 4 2016-01-20 3->4 1->2->3->4
Tom 4 2016-01-21 NA 1->2->3->4 …
Run Code Online (Sandbox Code Playgroud) 假设我有以下目标表:
CREATE TABLE DimCustomer (
CustomerKey serial PRIMARY KEY,
CustomerNum int NOT NULL,
CustomerName varchar(25) NOT NULL,
Planet varchar(25) NOT NULL,
RowIsCurrent char(1) NOT NULL DEFAULT 'Y',
RowStartDate date NOT NULL DEFAULT CURRENT_TIMESTAMP,
RowEndDate date NOT NULL DEFAULT '12/31/9999'
);
INSERT INTO DimCustomer
(CustomerNum, CustomerName, Planet, RowStartDate)
VALUES (101,'Anakin Skywalker', 'Tatooine', CURRENT_TIMESTAMP - INTERVAL '101 days'),
(102,'Yoda', 'Coruscant', CURRENT_TIMESTAMP - INTERVAL '100 days'),
(103,'Obi-Wan Kenobi', 'Coruscant', CURRENT_TIMESTAMP - INTERVAL '100 days')
Run Code Online (Sandbox Code Playgroud)
我有一个以下暂存表:
CREATE TABLE Staging_DimCustomer
(
CustomerNum int NOT NULL, …
Run Code Online (Sandbox Code Playgroud)