Создание нового столбца на основе уникального идентификатора со значениями в r - PullRequest
0 голосов
/ 31 мая 2018

Для каждого из этих идентификаторов я хотел бы создать новый столбец с именем Age, заполненный значениями 0 to 5 for each ID (r = 0: 5), как показано ниже.

Фрейм данных

ID         
1124
1123

Желаемый результат

ID   Age
1124  0
1124  1
1124  2
1124  3
1124  4
1124  5
1123  0
1123  1
1123  2
1123  3
1123  4
1123  5

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Это можно сделать с помощью tidyr::expand:

library(tidyverse)

df = data_frame(ID = c(1124, 1123))

df %>%
    expand(ID, Age = 0:5)

Вывод:

# A tibble: 12 x 2
      ID   Age
   <dbl> <int>
 1  1123     0
 2  1123     1
 3  1123     2
 4  1123     3
 5  1123     4
 6  1123     5
 7  1124     0
 8  1124     1
 9  1124     2
10  1124     3
11  1124     4
12  1124     5
0 голосов
/ 31 мая 2018

Вот базовая версия R:

df = data_frame(ID = c(1124, 1123))
expand.grid(ID = df$ID, Age = 0:5)

##      ID Age
## 1  1124   0
## 2  1123   0
## 3  1124   1
## 4  1123   1
## 5  1124   2
## 6  1123   2
## 7  1124   3
## 8  1123   3
## 9  1124   4
## 10 1123   4
## 11 1124   5
## 12 1123   5

Это отсортировано иначе, чем результат tidyr::expand.

РЕДАКТИРОВАТЬ

As@thelatemail предложил, вы можете сделать следующее, чтобы избежать переименования df

expand.grid(c(Age=list(0:5), df))

или

merge(df, list(Age=0:5))

РЕДАКТИРОВАТЬ 2

Здесьa data.table пример:

library(data.table)
setDT(df) # Convert df to a data.table.
df[, do.call(CJ, list(ID = ID, Age = 0:5))]

Для больших наборов данных может потребоваться сравнить различные методы.

0 голосов
/ 31 мая 2018
library(tidyverse)
your_data_frame %>%
    group_by(ID) %>%
    mutate(Age = (1:n()) - 1)

Это также работает, если у вас есть более 6 Age значений на ID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...