首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >逐日计算变量值的进度

逐日计算变量值的进度
EN

Stack Overflow用户
提问于 2015-07-09 14:13:49
回答 3查看 58关注 0票数 2

这是我的数据:

代码语言:javascript
运行
复制
ID       Day       number.of.day
ID1      Day1          5
ID1      Day1          5
ID1      Day1          5
ID1      Day1          5
ID1      Day1          5
ID1      Day2          4
ID1      Day2          4
ID1      Day2          4
ID1      Day2          4
ID1      Day3          1
ID1      Day4          1
ID2      Day1          2
ID2      Day1          2
ID2      Day2          3
ID2      Day2          3
ID2      Day2          3

更新:

我想一天一天地计算每个ID的number.of.day ,以下是预期的结果:

代码语言:javascript
运行
复制
ID       Day       number.of.day      advance
ID1      Day1          5                NA
ID1      Day1          5                NA
ID1      Day1          5                NA
ID1      Day1          5                NA
ID1      Day1          5                NA
ID1      Day2          4                (4-5)/5
ID1      Day2          4                NA
ID1      Day2          4                NA
ID1      Day2          4                NA
ID1      Day3          1                (1-4)/4
ID1      Day4          1                (1-1)/1
ID2      Day1          2                NA
ID2      Day1          2                NA
ID2      Day2          3                (3-2)/2
ID2      Day2          3                NA
ID2      Day2          3                NA

希望得到你的回复!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-09 14:28:44

下面是一个使用data.table的简单而有效的解决方案

代码语言:javascript
运行
复制
library(data.table)
setDT(df)[!duplicated(df), advance := c(NA, diff(number.of.day)/number.of.day[-.N])]
#      ID  Day number.of.day advance
#  1: ID1 Day1             5      NA
#  2: ID1 Day1             5      NA
#  3: ID1 Day1             5      NA
#  4: ID1 Day1             5      NA
#  5: ID1 Day1             5      NA
#  6: ID1 Day2             4   -0.20
#  7: ID1 Day2             4      NA
#  8: ID1 Day2             4      NA
#  9: ID1 Day2             4      NA
# 10: ID1 Day3             1   -0.75
# 11: ID1 Day4             1    0.00
# 12: ID2 Day1             2    1.00
# 13: ID2 Day1             2      NA
# 14: ID2 Day2             3    0.50
# 15: ID2 Day2             3      NA
# 16: ID2 Day2             3      NA
票数 2
EN

Stack Overflow用户

发布于 2015-07-09 14:28:52

代码语言:javascript
运行
复制
library(dplyr)    
newdf <- df %>% group_by(ID) %>% 
mutate(advance = c(NA, head((lead(number.of.day)-number.of.day)/number.of.day, -1)), 
       diff = c(0, diff(as.numeric(Day))))
is.na(newdf$advance) <- newdf$diff == 0L
newdf[,-5]
# Source: local data frame [16 x 4]
# Groups: ID
# 
#     ID  Day number.of.day advance
# 1  ID1 Day1             5      NA
# 2  ID1 Day1             5      NA
# 3  ID1 Day1             5      NA
# 4  ID1 Day1             5      NA
# 5  ID1 Day1             5      NA
# 6  ID1 Day2             4   -0.20
# 7  ID1 Day2             4      NA
# 8  ID1 Day2             4      NA
# 9  ID1 Day2             4      NA
# 10 ID1 Day3             1   -0.75
# 11 ID1 Day4             1    0.00
# 12 ID2 Day1             2      NA
# 13 ID2 Day1             2      NA
# 14 ID2 Day2             3    0.50
# 15 ID2 Day2             3      NA
# 16 ID2 Day2             3      NA
票数 2
EN

Stack Overflow用户

发布于 2015-07-09 14:59:18

以下是另一个非常简单的建议,它只使用base R

代码语言:javascript
运行
复制
new_day <- which(diff(as.numeric(df$Day))>0)
day_change <- c(diff(df$number.of.day),0)
res <- day_change/df$number.of.day
temp <- res[new_day]
res[res==0] <- NA
res[new_day] <- temp
res <- c(NA,res[-length(res)])
df <- cbind(df,res)
#> df
#    ID  Day number.of.day   res
#1  ID1 Day1             5    NA
#2  ID1 Day1             5    NA
#3  ID1 Day1             5    NA
#4  ID1 Day1             5    NA
#5  ID1 Day1             5    NA
#6  ID1 Day2             4 -0.20
#7  ID1 Day2             4    NA
#8  ID1 Day2             4    NA
#9  ID1 Day2             4    NA
#10 ID1 Day3             1 -0.75
#11 ID1 Day4             1  0.00
#12 ID2 Day1             2  1.00
#13 ID2 Day1             2    NA
#14 ID2 Day2             3  0.50
#15 ID2 Day2             3    NA
#16 ID2 Day2             3    NA
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31320113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档