根据其他字段的重复值自增字段
Auto-increment field based on duplicate values of other fields
我有一个这样的数据框:
df <- data.frame(
COL1 = rep("28", 10),
COL2 = c(rep("33", 6), rep("45", 4)),
COL3 = c("10", "10", "10", "10", "23", "23", "22", "22", "22", "29")
)
> df
# COL1 COL2 COL3
# 1 28 33 10
# 2 28 33 10
# 3 28 33 10
# 4 28 33 10
# 5 28 33 23
# 6 28 33 23
# 7 28 45 22
# 8 28 45 22
# 9 28 45 22
# 10 28 45 29
现在我想根据 COL1 到 COL3 的重复值自动增量填充 COL4。输出应如下所示:
> df
# COL1 COL2 COL3 COL4
# 1 28 33 10 1
# 2 28 33 10 2
# 3 28 33 10 3
# 4 28 33 10 4
# 5 28 33 23 1
# 6 28 33 23 2
# 7 28 45 22 1
# 8 28 45 22 2
# 9 28 45 22 3
# 10 28 45 29 1
我该怎么做?任何帮助将不胜感激。
注意:列不一定排序。
基础 R
对于基数 R,使用 ave
:
vec <- apply(df, 1, paste, collapse = "")
df$COL4 <- ave(vec, vec, FUN = seq_along)
dplyr
使用 dplyr
、group_by
所有列并使用 row_number
。如果它们比 group_by 多列,您可以使用 group_by(across(everything()))
.
library(dplyr)
df %>%
group_by(COL1, COL2, COL3) %>%
mutate(COL4 = row_number())
输出
COL1 COL2 COL3 COL4
<chr> <chr> <chr> <int>
1 28 33 10 1
2 28 33 10 2
3 28 33 10 3
4 28 33 10 4
5 28 33 23 1
6 28 33 23 2
7 28 45 22 1
8 28 45 22 2
9 28 45 22 3
10 28 45 29 1
我有一个这样的数据框:
df <- data.frame(
COL1 = rep("28", 10),
COL2 = c(rep("33", 6), rep("45", 4)),
COL3 = c("10", "10", "10", "10", "23", "23", "22", "22", "22", "29")
)
> df
# COL1 COL2 COL3
# 1 28 33 10
# 2 28 33 10
# 3 28 33 10
# 4 28 33 10
# 5 28 33 23
# 6 28 33 23
# 7 28 45 22
# 8 28 45 22
# 9 28 45 22
# 10 28 45 29
现在我想根据 COL1 到 COL3 的重复值自动增量填充 COL4。输出应如下所示:
> df
# COL1 COL2 COL3 COL4
# 1 28 33 10 1
# 2 28 33 10 2
# 3 28 33 10 3
# 4 28 33 10 4
# 5 28 33 23 1
# 6 28 33 23 2
# 7 28 45 22 1
# 8 28 45 22 2
# 9 28 45 22 3
# 10 28 45 29 1
我该怎么做?任何帮助将不胜感激。
注意:列不一定排序。
基础 R
对于基数 R,使用 ave
:
vec <- apply(df, 1, paste, collapse = "")
df$COL4 <- ave(vec, vec, FUN = seq_along)
dplyr
使用 dplyr
、group_by
所有列并使用 row_number
。如果它们比 group_by 多列,您可以使用 group_by(across(everything()))
.
library(dplyr)
df %>%
group_by(COL1, COL2, COL3) %>%
mutate(COL4 = row_number())
输出
COL1 COL2 COL3 COL4
<chr> <chr> <chr> <int>
1 28 33 10 1
2 28 33 10 2
3 28 33 10 3
4 28 33 10 4
5 28 33 23 1
6 28 33 23 2
7 28 45 22 1
8 28 45 22 2
9 28 45 22 3
10 28 45 29 1