Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.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中连续数字的长度_R_Dataframe_Dplyr_Tidyverse - Fatal编程技术网

求R中连续数字的长度

求R中连续数字的长度,r,dataframe,dplyr,tidyverse,R,Dataframe,Dplyr,Tidyverse,我有一个data.frame,看起来像这样: data=data.frame(position=c(1,2,3,1,1,4,5,6,7,8,2,2), name=c("A","B","C","A","A","D","E","F","G","H","B",

我有一个data.frame,看起来像这样:

data=data.frame(position=c(1,2,3,1,1,4,5,6,7,8,2,2),
             name=c("A","B","C","A","A","D","E","F","G","H","B","B"))

 position name
     1    A
     2    B
     3    C
     1    A
     1    A
     4    D
     5    E
     6    F
     7    G
     8    H
     2    B
     2    B

我希望能够在“位置”列中识别所有连续间隔 然后将每个间隔的长度粘贴到新列中

我希望我的数据看起来像这样

position  length
  1 - 3     3  
  4 - 8     5  
非常感谢您提供的任何帮助和意见

这是否有效:

library(dplyr)
library(tidyr)
library(data.table)
data %>% mutate(ID = case_when (position == lead(position) - 1 ~ 1, TRUE ~ 0)) %>% 
mutate(ID = case_when(position == lag(position) + 1 ~ 1, TRUE ~ ID)) %>% mutate(r = rleid(ID)) %>% filter(ID == 1) %>% 
group_by(r) %>% mutate(position = paste(min(position),max(position), sep = '-'), length = length(unique(name))) %>% ungroup() %>% select(1,5) %>% distinct()
# A tibble: 2 x 2
  position length
  <chr>     <int>
1 1-3           3
2 4-8           5
> 
库(dplyr)
图书馆(tidyr)
库(数据表)
数据%>%突变(ID=case_,当(位置==lead(位置)-1~1,TRUE~0))%>%
当(位置==滞后(位置)+1~1,TRUE~ID))%%>%发生变化时(ID=case_))%%>%发生变化时(r=rleid(ID))%%>%filter(ID==1)%%>%
分组依据(r)%%>%变异(位置=粘贴(最小(位置),最大(位置),sep='-'),长度=长度(唯一(名称))%%>%ungroup()%%>%select(1,5)%%>%distinct()
#一个tibble:2x2
位置长度
1 1-3           3
2 4-8           5
> 
这是否有效:

library(dplyr)
library(tidyr)
library(data.table)
data %>% mutate(ID = case_when (position == lead(position) - 1 ~ 1, TRUE ~ 0)) %>% 
mutate(ID = case_when(position == lag(position) + 1 ~ 1, TRUE ~ ID)) %>% mutate(r = rleid(ID)) %>% filter(ID == 1) %>% 
group_by(r) %>% mutate(position = paste(min(position),max(position), sep = '-'), length = length(unique(name))) %>% ungroup() %>% select(1,5) %>% distinct()
# A tibble: 2 x 2
  position length
  <chr>     <int>
1 1-3           3
2 4-8           5
> 
库(dplyr)
图书馆(tidyr)
库(数据表)
数据%>%突变(ID=case_,当(位置==lead(位置)-1~1,TRUE~0))%>%
当(位置==滞后(位置)+1~1,TRUE~ID))%%>%发生变化时(ID=case_))%%>%发生变化时(r=rleid(ID))%%>%filter(ID==1)%%>%
分组依据(r)%%>%变异(位置=粘贴(最小(位置),最大(位置),sep='-'),长度=长度(唯一(名称))%%>%ungroup()%%>%select(1,5)%%>%distinct()
#一个tibble:2x2
位置长度
1 1-3           3
2 4-8           5
> 

这是一个基本的R解决方案

创建列
sequence
,该列指示哪些行是连续的

data$sequence <- c(NA, head(data$position, -1)) + 1 == data$position
data$sequence[[1]] <- data$sequence[[2]]

data
#>    position name sequence
#> 1         1    A     TRUE
#> 2         2    B     TRUE
#> 3         3    C     TRUE
#> 4         1    A    FALSE
#> 5         1    A    FALSE
#> 6         4    D    FALSE
#> 7         5    E     TRUE
#> 8         6    F     TRUE
#> 9         7    G     TRUE
#> 10        8    H     TRUE
#> 11        2    B    FALSE
#> 12        2    B    FALSE

这是一个基本的R解决方案

创建列
sequence
,该列指示哪些行是连续的

data$sequence <- c(NA, head(data$position, -1)) + 1 == data$position
data$sequence[[1]] <- data$sequence[[2]]

data
#>    position name sequence
#> 1         1    A     TRUE
#> 2         2    B     TRUE
#> 3         3    C     TRUE
#> 4         1    A    FALSE
#> 5         1    A    FALSE
#> 6         4    D    FALSE
#> 7         5    E     TRUE
#> 8         6    F     TRUE
#> 9         7    G     TRUE
#> 10        8    H     TRUE
#> 11        2    B    FALSE
#> 12        2    B    FALSE

保罗,谢谢你抽出时间。我想问你代码这一部分的“结尾”是什么意思:我的代码中有一个输入错误<代码>结束应该是
i_结束
。我现在已经更新了代码
i_end
包含每个连续块的最后一行ID,其中
sequence==TRUE
。在本例中,它包含
3,10
。谢谢你,Paul,抽出时间。我想问你代码这一部分的“结尾”是什么意思:我的代码中有一个输入错误<代码>结束应该是
i_结束
。我现在已经更新了代码
i_end
包含每个连续块的最后一行ID,其中
sequence==TRUE
。在本例中,它包含
3,10