我有一个包含两组 ID 的 data.frame
,它们都可能是多余的。
这是一个例子:
df <- data.frame(id1 = c("id.1","id.1","id.1","id.1","id.1","id.2","id.2","id.3"),
id2 = c("id.1.a","id.1.b","id.1.a","id.1.c","id.1.b","id.2.a","id.2.b","id.3.a"))
我想要做的是添加另一个 ID 列,其中 df$id1
将有一个数字后缀,值增加,遵循 df$id2
的顺序.
因此对于上面的示例,生成的 data.frame 将是:
res.df <- data.frame(id1 = c("id.1","id.1","id.1","id.1","id.1","id.2","id.2","id.3"),
id2 = c("id.1.a","id.1.b","id.1.a","id.1.c","id.1.b","id.2.a","id.2.b","id.3.a"),
id3 = c("id.1.01","id.1.03","id.1.02","id.1.05","id.1.04","id.2.01","id.2.02","id.3"))
因为 id.1
映射到 id.1.a
两次,映射到 id.1.b
两次,然后映射到 id.1.c
一次,变成:id.1.01, id.1.03, id.1.02, id.1.05, id.1.04
知道如何使用 dplyr
或 tidyr
实现这一点吗?
最佳答案
- 我们按
id1
对行进行分组,因为这是我们要计算行数的分组。 - 我们将它们排列为
id1
后跟id2
- 我们创建一个新列,将
row_number
附加到id1
的末尾。由于行按id1
和id2
排列,row_number
将保持该顺序
例子:
df %>%
group_by(id1) %>%
arrange(id1, id2) %>%
mutate(id3 = paste0(id1, '.', row_number()))
# A tibble: 8 x 3
# Groups: id1 [3]
id1 id2 id3
<fct> <fct> <chr>
1 id.1 id.1.a id.1.1
2 id.1 id.1.a id.1.2
3 id.1 id.1.b id.1.3
4 id.1 id.1.b id.1.4
5 id.1 id.1.c id.1.5
6 id.2 id.2.a id.2.1
7 id.2 id.2.b id.2.2
8 id.3 id.3.a id.3.1
关于r - 使用 dplyr 枚举 data.frame 中的冗余值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51756293/