我的数据框
plate phase score
A 1 1
A 2 1
A 3 2
A 1 1
A 2 1
A 3 2
A 1 1
A 2 1
A 3 2
B 1 1
B 2 1
B 3 4
B 1 1
B 2 1
B 3 4
为有序数据帧的每3行生成一个唯一的标识符(每个三元组中有重复的行;但是,尽管它们相同,但它们需要不同的标识符)。也就是说,每个有序三元组都需要具有唯一的标识符。谢谢您的帮助!
这是(我想要的样子):
plate phase score tripletID
A 1 1 A.1
A 2 1 A.1
A 3 2 A.1
A 1 1 A.2
A 2 1 A.2
A 3 2 A.2
A 1 1 A.3
A 2 1 A.3
A 3 2 A.3
B 1 1 B.1
B 2 1 B.1
B 3 2 B.1
B 1 1 B.2
B 2 1 B.2
B 3 2 B.2
答案 0 :(得分:2)
一个dplyr
选项可能是:
df %>%
group_by(plate) %>%
mutate(tripletID = paste(plate, gl(n()/3, 3), sep = "."))
plate phase score tripletID
<chr> <int> <int> <chr>
1 A 1 1 A.1
2 A 2 1 A.1
3 A 3 2 A.1
4 A 1 1 A.2
5 A 2 1 A.2
6 A 3 2 A.2
7 A 1 1 A.3
8 A 2 1 A.3
9 A 3 2 A.3
10 B 1 1 B.1
11 B 2 1 B.1
12 B 3 2 B.1
13 B 1 1 B.2
14 B 2 1 B.2
15 B 3 2 B.2
如果有一种情况,您的最后一个ID不会有三种情况:
df %>%
group_by(plate) %>%
mutate(tripletID = paste(plate, gl(ceiling(n()/3), 3, n()), sep = "."))
答案 1 :(得分:2)
我们可以在基数R中使用user_reference
,并为每个ave
创建一个序列列,将其除以3,然后使用plate
进行四舍五入
ceiling
使用with(df, paste0(plate, ".", ceiling(ave(phase, plate, FUN = seq_along)/3)))
#[1] "A.1" "A.1" "A.1" "A.2" "A.2" "A.2" "A.3" "A.3" "A.3" "B.1" "B.1" "B.1"
# "B.2" "B.2" "B.2"
,可以这样完成:
dplyr
和library(dplyr)
df %>%
group_by(plate) %>%
mutate(temp = paste0(plate, ".", ceiling(row_number() / 3)))
data.table
答案 2 :(得分:2)
您可以使用rep
获取3个组的唯一标识符,例如:
rep(seq_len(nrow(x)/3), each=3)
[1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
如果您希望问题中显示的组合,可以使用ave
来按plate
进行分组,并使用paste
和rep
来获得唯一标识符。
ave(x$plate, x$plate, FUN=function(x) {
paste(x, rep(seq_len(length(x)/3), each=3), sep=".")})
# [1] "A.1" "A.1" "A.1" "A.2" "A.2" "A.2" "A.3" "A.3" "A.3" "B.1" "B.1" "B.1"
#[13] "B.2" "B.2" "B.2"
或使用split
和lapply
unlist(lapply(split(x$plate, x$plate), FUN=function(x) {
paste(x, rep(seq_len(length(x)/3), each=3),sep=".")}))
数据:
x <- read.table(header=TRUE, stringsAsFactors=FALSE, text="plate phase score
A 1 1
A 2 1
A 3 2
A 1 1
A 2 1
A 3 2
A 1 1
A 2 1
A 3 2
B 1 1
B 2 1
B 3 2
B 1 1
B 2 1
B 3 2")