创建组中顺序出现的索引

雅各布

我在R中有一个大数据框,两组可能看起来像这样:

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-statement进行了一些比较,以确定重叠的数字,这给了我这样的数据框:

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

最后,我需要确定组中每个子组的出现。结果应该是这样的:

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上,但是我不知道如何。有任何想法吗?任何帮助表示赞赏。

谢谢!

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

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:样本数据

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))
tmfmnk

一种涉及dplyr并且tidyr可能的选择是:

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 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据整数向量中数字的顺序出现来创建一组指标

在rxjs中,如何创建顺序值组?

正确在Postgres中创建索引的列顺序

在 Pandas 中,如何按组中下一次出现的迭代项的顺序创建列

如何在R中为嵌套组创建组索引

为什么组在报告中以不同顺序出现?

Rails 索引顺序和组

创建组对的滚动索引

查找(有序)组中先前出现的模态的索引

按出现顺序分配索引

为Spark数据框中的每个组创建索引

Pandas:按时间序列中的组创建索引值

索引中的列顺序

熊猫:根据其组内元素的相对索引在多索引数据框中创建列

如何计算一组单词以任何顺序出现在列中的次数?

Pandas - 如何识别列中两个值以特定顺序出现的数据组?

在数据框中添加一列,以对组中的出现次数进行索引

在Rstudio中创建字母仅出现一次且仅出现一次的组

fabricjs对象在组中的顺序

Python熊猫按顺序计算多索引中唯一对的出现次数

从Redisearch索引中获取单词列表,按最常见的出现顺序进行排序

如何获取列中组第一次出现的索引?

在面板中的组的事件之前创建以事件和零开始的顺序计数器

创建在面板数据组中的条件下重新启动的顺序计数器

在随时间重复的顺序数据中创建唯一的组

如何按组创建顺序计数,以排除上面各行中的值

在顺序无关紧要的R中创建列的唯一组合的df

创建表中的顺序?

猫鼬复合索引创建字段顺序