Нумерация строк на основе уникальных комбинаций нескольких столбцов в R - PullRequest
1 голос
/ 19 февраля 2020

У меня есть набор данных в этом стиле:

Treatments         Replicates           Value      Id
1                  1                    ###        NA
1                  1                    ###        NA
1                  1                    ###        NA
1                  2                    ###        NA
1                  2                    ###        NA
1                  2                    ###        NA
2                  1                    ###        NA
2                  1                    ###        NA
2                  1                    ###        NA
2                  2                    ###        NA
2                  2                    ###        NA
2                  2                    ###        NA

Я пытаюсь написать код для R, чтобы заполнить столбец 'id' путем нумерации строк для каждой уникальной комбинации столбцов. и «Реплики».

Конечный результат будет выглядеть следующим образом:

Treatments         Replicates           Value      Id
1                  1                    ###        1
1                  1                    ###        2
1                  1                    ###        3
1                  2                    ###        1
1                  2                    ###        2
1                  2                    ###        3
2                  1                    ###        1
2                  1                    ###        2
2                  1                    ###        3
2                  2                    ###        1
2                  2                    ###        2
2                  2                    ###        3

Это упрощенный набор данных. У каждой уникальной комбинации есть неодинаковые числа, поэтому код должен каким-то образом обрабатывать кадр данных.

Спасибо

Дополнительно:

Есть ли способ, чтобы Id был числом уникальных комбинаций? с результирующим df вроде:

Treatments         Replicates           Value      Id
1                  1                    ###        1
1                  1                    ###        1
1                  1                    ###        1
1                  2                    ###        2
1                  2                    ###        2
1                  2                    ###        2
2                  1                    ###        3
2                  1                    ###        3
2                  1                    ###        3
2                  2                    ###        4
2                  2                    ###        4
2                  2                    ###        4

1 Ответ

3 голосов
/ 19 февраля 2020

Мы можем использовать rowid из data.table

library(data.table)
df1$Id <- with(df1, rowid(Treatments, Replicates))

Или использовать data.table синтаксис

setDT(df1)[, Id := rowid(Treatments, Replicates))]

Если нам нужен идентификатор группы, используйте .GRP

setDT(df1)[, Id := .GRP, .(Treatments, Replicates)]

Или используя dplyr

df1 %>%
    group_by(Treatments, Replicates) %>% 
    mutate(Id = row_number())

Чтобы получить групповые индексы, в версии devel

df1 %>%
  group_by(Treatments, Replicates) %>% 
  mutate(Id = cur_group_id())

Или в текущем dplyr версия

df1 %>%
    mutate(Id = group_indices(., Treatments, Replicates))

В base R это можно сделать с помощью ave

df1$Id <- with(df1, ave(seq_along(Treatments), Treatments,
             Replicates, FUN = seq_along))

data

df1 <- structure(list(Treatments = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L), Replicates = c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 
1L, 2L, 2L, 2L), Value = c(4L, 5L, 7L, 9L, 25L, 39L, 43L, 24L, 
12L, 9L, 4L, 2L), Id = c(NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_)), row.names = c(NA, 
-12L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...