Как добавить 1) добавить уникальный идентификатор каждые 3 строки кадра данных - PullRequest
0 голосов
/ 03 октября 2019

Мой фрейм данных

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 ]

2 голосов
/ 03 октября 2019

Мы можем использовать ave в базе R и создать столбец последовательности для каждого plate, разделить его на 3 и округлить, используя 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

library(data.table)
setDT(df)[, temp := paste0(plate, ".", ceiling(seq_len(.N)/3)), plate]
2 голосов
/ 03 октября 2019

Вы можете использовать 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")
2 голосов
/ 03 октября 2019

Один 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     

Если возможен сценарий, в котором у вас не будет трех вариантов для последнего идентификатора:

df %>%
 group_by(plate) %>%
 mutate(tripletID = paste(plate, gl(ceiling(n()/3), 3, n()), sep = "."))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...