我在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-statements做了一些比较,以识别重叠的数字,这给我提供了如下数据:
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))发布于 2021-01-04 12:37:15
涉及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 https://stackoverflow.com/questions/65561798
复制相似问题