data.table генерирует последовательность с интервалами на основе первой и последней строк уникального идентификатора - PullRequest
1 голос
/ 30 мая 2019

У меня есть такая таблица данных. Как бы я сгенерировал последовательность с шагом .25 для каждой строки с одинаковым временем в этом идентификационном номере. Я довольно новичок в R и пытаюсь разобраться с данными ...

     id time
 1:  1   14
 2:  1   14
 3:  1   14
 4:  1   14
 5:  1   18
 6:  1   18
 7:  1   22
 8:  1   22
 9:  2    8
10:  2    8
11:  2    8
12:  2    8
13:  2   12
14:  2   15
15:  2   15
16:  2   15
17:  2   19
18:  2   19
19:  2   19
20:  2   19

Я бы хотел, чтобы это было так

    id time new_time
 1:  1   14 14.00
 2:  1   14 14.25 
 3:  1   14 14.50 
 4:  1   14 14.75
 5:  1   18 18.00
 6:  1   18 18.25
 7:  1   22 22.00
 8:  1   22 22.25
 9:  2    8 8.00
10:  2    8 8.25
11:  2    8 8.50
12:  2    8 8.75
13:  2   12 12.00
14:  2   15 15.00
15:  2   15 15.25
16:  2   15 15.50
17:  2   19 19.00
18:  2   19 19.25
19:  2   19 19.50
20:  2   19 19.75

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Вы можете использовать аргумент length.out в seq, который мы устанавливаем для размера группы каждого time (это .N в приведенном ниже коде, который является специальным символом, который data.table предоставляет,см. ?.N)

DT[, new_time := seq(first(time), by = 0.25, length.out = .N)  , by=time][]
#    id time new_time
# 1:  1   14    14.00
# 2:  1   14    14.25
# 3:  1   14    14.50
# 4:  1   14    14.75
# 5:  1   18    18.00
# 6:  1   18    18.25
# 7:  1   22    22.00
# 8:  1   22    22.25
# 9:  2    8     8.00
#10:  2    8     8.25
#11:  2    8     8.50
#12:  2    8     8.75
#13:  2   12    12.00
#14:  2   15    15.00
#15:  2   15    15.25
#16:  2   15    15.50
#17:  2   19    19.00
#18:  2   19    19.25
#19:  2   19    19.50
#20:  2   19    19.75

Другой вариант будет rowid (и некоторые исчисления)

DT[, new_time := time + (rowid(time) - 1L) * 0.25]

данные

library(data.table)
DT <- fread(text = "     id time
  1   14
  1   14
  1   14
  1   14
  1   18
  1   18
  1   22
  1   22
  2    8
  2    8
  2    8
  2    8
  2   12
  2   15
  2   15
  2   15
  2   19
  2   19
  2   19
  2   19")
0 голосов
/ 30 мая 2019

Подумайте о создании воспроизводимого примера в следующий раз. (см. пример, который я привел в коде, это будет полезно в будущем, когда у вас возникнут вопросы).

Я использовал tidyverse (в частности, пакет dplyr) для решения этой проблемы.

## Load library (this loads lots of packages, specifically we are using dplyr)
library(tidyverse)

## Reproducible example
data <- tibble(id = c(rep(1,8),rep(2,12)),
               time = c(rep(14,4),rep(18,2),rep(22,2),rep(8,4),12,rep(15,3),rep(19,4)))

print(data)
# A tibble: 20 x 2
      id  time
   <dbl> <dbl>
 1     1    14
 2     1    14
 3     1    14
 4     1    14
 5     1    18
 6     1    18
 7     1    22
 8     1    22
 9     2     8
10     2     8
11     2     8
12     2     8
13     2    12
14     2    15
15     2    15
16     2    15
17     2    19
18     2    19
19     2    19
20     2    19

## Data with increments for each group
new_data <- data %>%
  ##Groups your data by the same variable, in this case you want to increment by 0.25 for each id within the time group
  group_by(time) %>% 
  ## Increments each id by 0.25
  mutate(new_time = ifelse((row_number() == 1), time, (0.25 * (row_number()-1)) + time)) %>% 
  ## Ungroups the data
  ungroup()

print(as.data.frame(new_data))

   id time new_time
1   1   14    14.00
2   1   14    14.25
3   1   14    14.50
4   1   14    14.75
5   1   18    18.00
6   1   18    18.25
7   1   22    22.00
8   1   22    22.25
9   2    8     8.00
10  2    8     8.25
11  2    8     8.50
12  2    8     8.75
13  2   12    12.00
14  2   15    15.00
15  2   15    15.25
16  2   15    15.50
17  2   19    19.00
18  2   19    19.25
19  2   19    19.50
20  2   19    19.75
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...