Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 创建重置为1的计数连续变量_R - Fatal编程技术网

R 创建重置为1的计数连续变量

R 创建重置为1的计数连续变量,r,R,我有一个如下所示的数据集,其中“group”是一个组变量。我想按组计算“下一个”天数,但如果不是第二天,我希望将计数重置为一(如“想要”列所示)。然后,我想返回“want”列的最大数量(如want2中所示)。建议将不胜感激 df<-data.frame(group=c(1, 1, 1, 1, 2, 2, 2), date=c("2000-01-01", "2000-01-03", "2000-01-04", "2000-01-05", "2000-01-09

我有一个如下所示的数据集,其中“group”是一个组变量。我想按组计算“下一个”天数,但如果不是第二天,我希望将计数重置为一(如“想要”列所示)。然后,我想返回“want”列的最大数量(如want2中所示)。建议将不胜感激

df<-data.frame(group=c(1, 1, 1, 1, 2, 2, 2), 
               date=c("2000-01-01", "2000-01-03", "2000-01-04", "2000-01-05", "2000-01-09", "2000-01-10", "2000-01-12"),
               want=c(1,1,2,3,1,2,1),
               want2=c(3,3,3,3,2,2,2))
我尝试过akrun的建议,该建议在没有二进制变量的情况下效果很好,我尝试将二进制变量添加到cumsum中进行修改,但我得到了错误:

df %>% group_by(group) 
%>% mutate(wantn = rowid(cumsum(c(TRUE, diff(as.Date(date)) !=1 & binary==1)))

谢谢

一个选项是按“组”分组,然后在转换为“日期”的
类上使用
diff
,创建一个逻辑向量,并使用
cumsum
在“want”(“wantn”)中复制结果,然后使用“wantn”,在其上应用
max

library(dplyr)
library(data.table)
df %>% 
   group_by(group) %>%
   mutate(wantn = rowid(cumsum(c(TRUE, diff(as.Date(date)) !=1))), 
          want2n = max(wantn))
# A tibble: 7 x 6
# Groups:   group [2]
#  group date        want want2 wantn want2n
#  <dbl> <fct>      <dbl> <dbl> <int>  <int>
#1     1 2000-01-01     1     3     1      3
#2     1 2000-01-03     1     3     1      3
#3     1 2000-01-04     2     3     2      3
#4     1 2000-01-05     3     3     3      3
#5     2 2000-01-09     1     2     1      2
#6     2 2000-01-10     2     2     2      2
#7     2 2000-01-12     1     2     1      2

我建议您调整数据的形状,使
$date
实际上是一个日期,而不仅仅是一个字符串。这样,计算一行和下一行之间的差异(以天为单位)就容易多了。你试过什么吗?例如,您使用的是
data.table
还是
dplyr
还是仅使用基本R?请使用dplyr并尝试使用data.table。它是作为一个日期变量,我刚刚发布了一个字符串作为示例biostatguy12,明白了。。。但在提问时请提供有代表性的数据;许多问题往往很难回答,因为提问者不知道
日期
类(等),所以我们经常想知道问题的具体程度。(一个简单的补救办法是在
Date=
行中添加
as.Date(…)
。对于akrun的优秀答案,现在可能并不重要,但在将来,清晰性很好。除此之外,还有很好的示例数据,感谢您将其保持在较小的范围内!)感谢您的反馈!嗨,阿克伦,谢谢你的回复。这是很有帮助的,但是如果第2组有一个日期=2000-01-13的额外观察,该方法会崩溃,并且不会重置为1(在观察7),然后want2n不是我想要的:``df%突变(wantn=cumsum(c(TRUE,diff(as.date(date))==1)),want2n=max(wantn))``漂亮。谢谢嗨@akrun我只是好奇,我想用这个方法,但是如果我有一个数值变量(date2)而不是“date”呢?例如:df@biostatguy12我猜你的新问题与此有关,对吧。我在那里添加了一个解决方案
library(dplyr)
library(data.table)
df %>% 
   group_by(group) %>%
   mutate(wantn = rowid(cumsum(c(TRUE, diff(as.Date(date)) !=1))), 
          want2n = max(wantn))
# A tibble: 7 x 6
# Groups:   group [2]
#  group date        want want2 wantn want2n
#  <dbl> <fct>      <dbl> <dbl> <int>  <int>
#1     1 2000-01-01     1     3     1      3
#2     1 2000-01-03     1     3     1      3
#3     1 2000-01-04     2     3     2      3
#4     1 2000-01-05     3     3     3      3
#5     2 2000-01-09     1     2     1      2
#6     2 2000-01-10     2     2     2      2
#7     2 2000-01-12     1     2     1      2
df %>%
    group_by(group) %>%
    group_by(group2 = cumsum(c(TRUE, diff(as.Date(date)) !=1)), add = TRUE) %>%
    mutate(wantn = row_number()) %>%
    group_by(group) %>%
    mutate(want2n = max(wantn)) %>%       
    select(-group2)