首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建群体中连续发生的索引

创建群体中连续发生的索引
EN

Stack Overflow用户
提问于 2021-01-04 11:17:50
回答 1查看 108关注 0票数 1

我在R中有一个很大的数据,两组可能如下所示:

代码语言:javascript
复制
id     tnr
1      1
1      1-3
1      4
1      5
1      6
1      6-8
1      8-9
1      10
1      10-11
1      12
2      1
2      2
2      3
2      3-4

问题是重叠的数字。在第一步中,我将-字符的数字拆分,以便将这两个部分转换为数字。然后,我与ifelse-statements做了一些比较,以识别重叠的数字,这给我提供了如下数据:

代码语言:javascript
复制
id     tnr     ovlp
1      1       1
1      1-3     1
1      4       0
1      5       0
1      6       1
1      6-8     1
1      8-9     1
1      10      1
1      10-11   1
1      12      0
2      1       0
2      2       0
2      3       0
2      3-4     1

在最后一步,我需要确定每个亚组的发生在小组内。结果应该是这样的:

代码语言:javascript
复制
id     tnr     ovlp     occ
1      1       1        1
1      1-3     1        1
1      4       0        0
1      5       0        0
1      6       1        2
1      6-8     1        2
1      8-9     1        2
1      10      1        3
1      10-11   1        3
1      12      0        0
2      1       0        0
2      2       0        0
2      3       1        1
2      3-4     1        1

我首先考虑使用0作为分隔符对每个序列进行编号。这在大多数情况下都是可行的,但有时,两个序列之间没有0。就像在这个例子中,当我有从6-9到10-11的重叠数时,在第一组中。因此,我想我需要以某种方式使用我的ifelse-statements将这个索引粘贴到occ-column,但我不知道是如何实现的。有什么想法吗?任何帮助都是非常感谢的。

谢谢!

编辑:识别重叠数字的代码:

代码语言:javascript
复制
df <- df %>% 
  mutate(ovlp = ifelse(tnr_a == lag(tnr_a) & id == lag(id) |
                               is.na(tnr_b) == FALSE & tnr_b == lag(tnr_b) & id == lag(id) |
                               tnr_a == lag(tnr_b & is.na(tnr_b) == FALSE & is.na(lag(tnr_b)) == FALSE & id == lag(id) |
                               lag(tnr_a) == tnr_b & is.na(tnr_b) == FALSE & is.na(lag(tnr_b)) == FALSE & id == lag(id) |
                               tnr_b == lag(tnr_b) & is.na(tnr_b) == FALSE & is.na(lag(tnr_b)) == FALSE & id == lag(id) |
                               str_detect(tnr, "\\-") == TRUE & lag(tnr_a) > tnr_a & lag(tnr_a) < tnr_b |
                               lag(str_detect(tnr, "\\-")) == TRUE & lag(tnr_a_) < tnr_a & lag(tnr_a) > tnr_b, 
                             1, 0)) %>%
  relocate(ovlp, .after = tnr) %>% 
  mutate(ovlp = ifelse(lead(ovlp) == 1 & lead(id) == id, 1, tnr_gruppe))

编辑2:示例数据

代码语言:javascript
复制
df <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L), tnr = c("1", "1-3", "4", "5", "6", "6-8", "8-9", 
"10", "10-11", "12", "1", "2", "3", "3-4")), class = "data.frame", row.names = c(NA, 
-14L))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-04 12:37:15

涉及dplyrtidyr的一种选择可能是:

代码语言:javascript
复制
df %>%
 rowid_to_column() %>%
 separate_rows(tnr) %>%
 group_by(id, tnr) %>%
 mutate(ovlp = as.integer(n() > 1)) %>%
 group_by(id) %>%
 mutate(occ = with(rle(ovlp), rep(cumsum(values) * values, lengths))) %>%
 group_by(rowid) %>%
 summarise(across(-tnr, first),
           across(tnr, ~ paste(., collapse = "-"))) 

   rowid    id  ovlp   occ tnr  
   <int> <int> <int> <int> <chr>
 1     1     1     1     1 1    
 2     2     1     1     1 1-3  
 3     3     1     0     0 4    
 4     4     1     0     0 5    
 5     5     1     1     2 6    
 6     6     1     1     2 6-8  
 7     7     1     1     2 8-9  
 8     8     1     1     3 10   
 9     9     1     1     3 10-11
10    10     1     0     0 12   
11    11     2     0     0 1    
12    12     2     0     0 2    
13    13     2     1     1 3    
14    14     2     1     1 3-4 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65561798

复制
相关文章

相似问题

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