如何添加1)每三行数据帧添加唯一标识符

时间:2019-10-03 05:44:01

标签: r

我的数据框

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

3 个答案:

答案 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进行分组,并使用pasterep来获得唯一标识符。

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"

或使用splitlapply

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")