求R中连续数字的长度
我有一个data.frame,看起来像这样:求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=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
。