Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 按id分组数据集,然后创建一个新列,从当前行和后续行中减去不同的列_R - Fatal编程技术网

R 按id分组数据集,然后创建一个新列,从当前行和后续行中减去不同的列

R 按id分组数据集,然后创建一个新列,从当前行和后续行中减去不同的列,r,R,我发现了类似的问题,但不完全相同。这是我的问题,我有以下数据集: > ds id begin end 1 1 2017-01-15 2017-01-17 2 1 2017-01-01 2017-01-03 3 2 2017-02-01 2017-02-28 4 4 2017-04-11 2017-05-11 5 3 2017-02-05 2017-02-10 6 4 2017-03-10 2017-03-20 7 1 2017-01-30 2017

我发现了类似的问题,但不完全相同。这是我的问题,我有以下数据集:

> ds
  id      begin        end
1  1 2017-01-15 2017-01-17
2  1 2017-01-01 2017-01-03
3  2 2017-02-01 2017-02-28
4  4 2017-04-11 2017-05-11
5  3 2017-02-05 2017-02-10
6  4 2017-03-10 2017-03-20
7  1 2017-01-30 2017-02-03
8  3 2017-02-28 2017-03-09
9  4 2017-02-26 2017-03-05
我想创建以下列:
check
,它为具有相同
id
值的每一行验证以下条件:

ds[i,]$begin - ds[i-1,]$end < 30 => 1 # for each row i
对信息进行排序(我们需要使用for循环为当前解决方案排序)

最后,预期产出:

> ds
  id      begin        end check
2  1 2017-01-01 2017-01-03     0
1  1 2017-01-15 2017-01-17     1
7  1 2017-01-30 2017-02-03     1
3  2 2017-02-01 2017-02-28     0
5  3 2017-02-05 2017-02-10     0
8  3 2017-02-28 2017-03-09     1
6  4 2017-03-10 2017-03-20     0
4  4 2017-04-11 2017-05-11     1
> 

感谢您的提示。

使用
dplyr
,使用
lag
可以简化以下操作:

ds %>% 
  group_by(id) %>% 
  arrange(id, begin) %>% 
  mutate(check = c(0, as.numeric(begin - lag(end) < 30)[-1]))

使用
dplyr
,使用
lag
可以简化:

ds %>% 
  group_by(id) %>% 
  arrange(id, begin) %>% 
  mutate(check = c(0, as.numeric(begin - lag(end) < 30)[-1]))
使用data.table:

setDT(ds)[,New:=as.numeric(begin-shift(end,fill=0)<30),id]
setDT(ds)[,New:=as.numeric(begin shift(end,fill=0)%group_by(id)%%>%mutate(New=as.numeric(begin lag(end,default=0)%arrange(id)
使用数据表:

setDT(ds)[,New:=as.numeric(begin-shift(end,fill=0)<30),id]
setDT(ds)[,New:=as.numeric(begin shift(end,fill=0)%group_by(id)%%>%mutate(New=as.numeric(begin lag(end,default=0)%arrange(id)

是的,它可以工作!我甚至不知道如何工作。请你解释一下它是如何工作的,没有那么多关于
dplyr
的文档,至少我找到了一些非常基本的例子。谢谢。是的,请看我的答案。是的,它可以工作!我甚至不知道如何工作。请你解释一下它是如何工作的,没有那么多文档关于
dplyr
,至少我发现了一些非常基本的例子。谢谢。是的,请看我的答案。你假设日期是排序的,但它们不是。不过使用
default
很好。@ShenglinChen使用
setDT
data.table
,这是一个非常好的解决方案,顺便说一句,这个包很好这是一个非常好的结果。在这两种情况下,结果都不是预期的。例如,请参见以下结果:
[1,“200170101”,“20170103”
您得到的是
1
,它应该是
0
。我们需要首先指定一个分组(按
id
然后按
begin
升序)否则它会得到一个错误的结果。@ShenglinChen我编辑了你的解决方案,添加了arrange子句,现在它得到了预期的结果。一旦我知道如何将相同的结果应用于
数据表,我将再次编辑解决方案。@ShenglinChen,编辑被拒绝,下面是为了获得预期结果所做的更改:
>ds%%>%group_by(id)%%>%arrange(id,begin)%%>%mutate(new=as.numeric(begin-lag(end,default=0)<30))
您假设日期是排序的,但它们不是。使用
默认值可以很好地调用它。@ShenglinChen使用
setDT
data.table
,非常好的解决方案,顺便说一句,这个包有一个非常好的结果。在这两种情况下,结果都不是预期的结果。例如,请参见:
[1,“200170101”,“20170103”]
您得到的是
1
,它应该是
0
。我们需要先指定一个分组(按
id
然后按
begin
升序)否则它会得到一个错误的结果。@ShenglinChen我编辑了你的解决方案,添加了arrange子句,现在它得到了预期的结果。一旦我知道如何将相同的结果应用于
数据表,我将再次编辑解决方案。@ShenglinChen,编辑被拒绝,下面是为了获得预期结果所做的更改:
>ds%%>%group_by(id)%%>%arrange(id,begin)%%>%mutate(new=as.numeric(begin-lag(end,default=0)<30))
在我的实际情况下,我需要在组的第一行中加一个零。我理解第二种方法(使用
NA
)为了对解决方案进行排序,我们需要添加:
arrange(id,begin)%%>%%
。在您的解决方案中,在这种情况下:
[-1]
是什么意思?关于vignette文档的好提示。您能分享更多关于此主题的参考文档吗。语法对我来说仍然很难理解。谢谢。代码
[-1]
排除了向量的第一个元素,因此我们可以用0来代替。据我所知,这就是所有的文档。我发现这个网站上有几个关于
dplyr
包的资源。这是培训。我为
数据共享了一个等价的信息。表
(评论@ShenglinChen answer。在我的真实案例中,我需要在组的第一行加一个零。我理解第二种方法(使用
NA
)为了对解决方案进行排序,我们需要添加:
排列(id,begin)%%>%
。您的解决方案中的:
[-1]是什么意思
在这种情况下?关于vignette文档的好提示。你能分享更多关于这个主题的参考文档吗?语法对我来说仍然很难理解。谢谢。代码
[-1]
排除了向量的第一个元素,所以我们可以用0来代替。据我所知,这就是所有的文档。我发现这个网站上有几个关于
dplyr
包的资源。这是培训。我分享了一个关于
数据的等效信息。表
(对@ShenglinChen答案的评论)。
Source: local data frame [8 x 4]
Groups: id [4]

      id      begin        end check
  <fctr>     <date>     <date> <dbl>
1      1 2017-01-01 2017-01-03     0
2      1 2017-01-15 2017-01-17     1
3      1 2017-01-30 2017-02-03     1
4      2 2017-02-01 2017-02-28     0
5      3 2017-02-05 2017-02-10     0
6      3 2017-02-28 2017-03-09     1
7      4 2017-03-10 2017-03-20     0
8      4 2017-04-11 2017-05-11     1
ds %>% 
  group_by(id) %>%
  mutate(check = as.numeric(begin - lag(end, order_by = begin) < 30))
setDT(ds)[,New:=as.numeric(begin-shift(end,fill=0)<30),id]
ds%>%group_by(id)%>%mutate(new=as.numeric(begin-lag(end,default=0)<30))%>%arrange(id)