首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据其他列的值大小创建新变量

根据其他列的值大小创建新变量
EN

Stack Overflow用户
提问于 2015-06-09 01:45:22
回答 1查看 735关注 0票数 2

我试图用一个名为'epi‘的新变量创建一个df (意为插曲).它基于'days.since.last‘变量。当'days.since.last‘的值大于90时,我希望插曲变量增加1。

这是最初的df

代码语言:javascript
复制
   deid session.number days.since.last
1     1              1               0
2     1              2               7
3     1              3              12
4     5              1               0
5     5              2               7
6     5              3              14
7     5              4              93
8     5              5               5
9     5              6             102
10   12              1               0
11   12              2              21
12   12              3             104
13   12              4               4

创建自

代码语言:javascript
复制
help <- data.frame(deid = c(1, 1, 1, 5, 5, 5, 5, 5, 5, 12, 12, 12, 12),
                   session.number = c(1, 2, 3, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4),
                   days.since.last = c(0, 7, 12, 0, 7, 14, 93, 5, 102, 0, 21, 104, 4))

这就是我希望达到的结果。

代码语言:javascript
复制
   deid session.number days.since.last epi
1     1              1               0   1
2     1              2               7   1
3     1              3              12   1
4     5              1               0   1
5     5              2               7   1
6     5              3              14   1
7     5              4              93   2
8     5              5               5   2
9     5              6             102   3
10   12              1               0   1
11   12              2              21   1
12   12              3             104   2
13   12              4               4   2

我最好的尝试是下面的代码,但是它不会改变每个新集的第一个值(它们保持在0).

代码语言:javascript
复制
help$epi <- as.numeric(0)

tmp <- gapply(help, form = ~ deid, FUN = function(x)
{     
  spanSeq <- rle(x$days.since.last <= 90)$lengths[rle(x$days.since.last <= 90)$values == TRUE] 
  x$epi[x$days.since.last <= 90] <- rep(seq_along(spanSeq), times = spanSeq)
  rm(spanSeq)
  x    
})
help2 <- do.call("rbind", tmp)
rownames(help2)<-c(1:length(help2$deid))

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-09 01:49:41

您可以使用dplyr这样做:

代码语言:javascript
复制
library(dplyr)
help %>% group_by(deid) %>% mutate(epi = cumsum(ifelse(days.since.last>90,1,0))+1)


   deid session.number days.since.last epi
1     1              1               0   1
2     1              2               7   1
3     1              3              12   1
4     5              1               0   1
5     5              2               7   1
6     5              3              14   1
7     5              4              93   2
8     5              5               5   2
9     5              6             102   3
10   12              1               0   1
11   12              2              21   1
12   12              3             104   2
13   12              4               4   2

本质上,group_by为您的“deid”变量按组执行所有操作。我们为每一个超过90的“days.since.last”分配一个1或0。然后,我们创建一个新的变量,即这1和0的累积和,加上一个,得到你想要的结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30721756

复制
相关文章

相似问题

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