将唯一标识符添加到 R 数据框中的同一列值
Add a unique identifier to the same column value in R data frame
我有一个数据框如下:
index val sample_id
1 1 14 5
2 2 22 6
3 3 1 6
4 4 25 7
5 5 3 7
6 6 34 7
对于带有 sample_id 的每一行,我想添加一个唯一标识符,如下所示:
index val sample_id
1 1 14 5
2 2 22 6-A
3 3 1 6-B
4 4 25 7-A
5 5 3 7-B
6 6 34 7-C
有什么建议吗?感谢您的帮助。
基础 R
dat$id2 <- ave(dat$sample_id, dat$sample_id,
FUN = function(z) if (length(z) > 1) paste(z, LETTERS[seq_along(z)], sep = "-") else as.character(z))
dat
# index val sample_id id2
# 1 1 14 5 5
# 2 2 22 6 6-A
# 3 3 1 6 6-B
# 4 4 25 7 7-A
# 5 5 3 7 7-B
# 6 6 34 7 7-C
整洁宇宙
library(dplyr)
dat %>%
group_by(sample_id) %>%
mutate(id2 = if (n() > 1) paste(sample_id, LETTERS[row_number()], sep = "-") else as.character(sample_id)) %>%
ungroup()
小提示:从一个或两个代码块中删除 as.character(z)
可能很诱人。首先,什么都不会改变(这里):基础 R 允许你有点草率;如果我们依赖于此并且需要新字段始终是character
,那么在那种一种罕见的情况中,所有行都具有唯一性sample_id
,则该列将保持 integer
。 dplyr
对此要小心得多;如果你 运行 没有 as.character
的 tidyverse 代码,你会看到错误。
使用 dplyr:
library(dplyr)
dplyr::group_by(df, sample_id) %>%
dplyr::mutate(sample_id = paste(sample_id, LETTERS[seq_along(sample_id)], sep = "-"))
index val sample_id
<int> <dbl> <chr>
1 1 14 5-A
2 2 22 6-A
3 3 1 6-B
4 4 25 7-A
5 5 3 7-B
6 6 34 7-C
如果您只想为同一个 sample_id
创建独特的标签,也许您可以像下面那样尝试 make.unique
transform(
df,
sample_id = ave(as.character(sample_id),sample_id,FUN = function(x) make.unique(x,sep = "_"))
)
这给出了
index val sample_id
1 1 14 5
2 2 22 6
3 3 1 6_1
4 4 25 7
5 5 3 7_1
6 6 34 7_2
我有一个数据框如下:
index val sample_id
1 1 14 5
2 2 22 6
3 3 1 6
4 4 25 7
5 5 3 7
6 6 34 7
对于带有 sample_id 的每一行,我想添加一个唯一标识符,如下所示:
index val sample_id
1 1 14 5
2 2 22 6-A
3 3 1 6-B
4 4 25 7-A
5 5 3 7-B
6 6 34 7-C
有什么建议吗?感谢您的帮助。
基础 R
dat$id2 <- ave(dat$sample_id, dat$sample_id,
FUN = function(z) if (length(z) > 1) paste(z, LETTERS[seq_along(z)], sep = "-") else as.character(z))
dat
# index val sample_id id2
# 1 1 14 5 5
# 2 2 22 6 6-A
# 3 3 1 6 6-B
# 4 4 25 7 7-A
# 5 5 3 7 7-B
# 6 6 34 7 7-C
整洁宇宙
library(dplyr)
dat %>%
group_by(sample_id) %>%
mutate(id2 = if (n() > 1) paste(sample_id, LETTERS[row_number()], sep = "-") else as.character(sample_id)) %>%
ungroup()
小提示:从一个或两个代码块中删除 as.character(z)
可能很诱人。首先,什么都不会改变(这里):基础 R 允许你有点草率;如果我们依赖于此并且需要新字段始终是character
,那么在那种一种罕见的情况中,所有行都具有唯一性sample_id
,则该列将保持 integer
。 dplyr
对此要小心得多;如果你 运行 没有 as.character
的 tidyverse 代码,你会看到错误。
使用 dplyr:
library(dplyr)
dplyr::group_by(df, sample_id) %>%
dplyr::mutate(sample_id = paste(sample_id, LETTERS[seq_along(sample_id)], sep = "-"))
index val sample_id
<int> <dbl> <chr>
1 1 14 5-A
2 2 22 6-A
3 3 1 6-B
4 4 25 7-A
5 5 3 7-B
6 6 34 7-C
如果您只想为同一个 sample_id
创建独特的标签,也许您可以像下面那样尝试 make.unique
transform(
df,
sample_id = ave(as.character(sample_id),sample_id,FUN = function(x) make.unique(x,sep = "_"))
)
这给出了
index val sample_id
1 1 14 5
2 2 22 6
3 3 1 6_1
4 4 25 7
5 5 3 7_1
6 6 34 7_2