根据R中的日期计算差异

bxjv4tth  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(116)

所以我正在研究人们在咨询后的财务状况。dataframe“counseling”看起来像这样,请注意,一个人将有多个会话,每个会话记录不同的分数:

Name      Date        credit score
            A       1/7/2016        600
            A       1/28/2016       620  
            C       2/2/2016        700 
            C       3/2/2016        660
            C       4/4/2016        750

我想写一个函数,它将 Dataframe 分为两个级别(已经这样做了),然后取名称的最后一个和第一个条目,并查找信用评分的差异。我希望建立信用评分的变化,客户从参加这个咨询服务,从他们进入的时间到他们离开的时间,因为我想然后输出这些到一个向量,并计算平均值。我不太确定如何告诉R区分每个名字的最后一个和第一个条目。不知道该怎么办。非常感谢各位的帮助!

jdg4fx2g

jdg4fx2g1#

使用tapply将一个函数应用于每个Name组(假设您已经首先对数据进行了排序,您说过您已经进行了排序):

with(dat, tapply(creditscore, Name, FUN=function(x) tail(x,1) - head(x,1)) )
# A  C 
#20 50
toiithl6

toiithl62#

一个dplyr解决方案(为了安全起见,使用排列行进行排序):

df %>%
group_by(Name) %>%
arrange(Date) %>%
summarise(last(creditscore)-first(creditscore))
sczxawaw

sczxawaw3#

我们也可以使用data.table(如果数据很大,并且不需要排序,则很有用):

library(data.table)

dat$Date <- as.Date(dat$Date,format="%m/%d/%Y")
setDT(dat)

res <- dat[,creditscore[which(Date==max(Date))]-creditscore[which(Date==min(Date))], by = Name]

> res
   Name V1
1:    A 20
2:    C 50

根据与@Frank关于效率的一些讨论,这里有一个更“data. table”的方式,它对数据进行一次排序,然后使用索引来计算我们的结果:

res <- dat[order(creditscore),creditscore[.N]-creditscore[1], by = Name]
ncgqoxb0

ncgqoxb04#

如果你的数据框叫做df -

CreditSc<-data.frame()
j<-1
for (i in unique(df$Name))
{
subs<-subset(df, Name == i)
CreditSc[j,]<-tail(subs$CreditScore, n = 1) - head(subs$CreditScore, n = 1)
j<-j+1
}
eqzww0vc

eqzww0vc5#

1.创建2个日期变量。我们将使用as创建两个Date格式(YYYY-MM-DD)的日期变量。Date()函数。
1.两个日期的区别。我们将使用difftime()函数来执行此任务。

difftime(date1, date2, units = )

相关问题