Как добавить столбец, где я интерпретирую другой столбец как период времени? - PullRequest
0 голосов
/ 17 апреля 2020

Допустим, у меня есть следующий фрейм данных, который называется example:

ID     amount_ID    
3      1
3      2
3      3
3      4
3      5
9      1
9      2
9      3
9      4
3      1
3      2
3      3

Как видно, когда новый ID запускает, amount_ID начинает считать с 1 снова.

Как я могу добавить столбец, где я хочу, чтобы временной интервал 100 для amount_ID, где последний amount_ID равен 100. Он должен выглядеть следующим образом:

ID     amount_ID   timespan
3      1           20         (because 1*100/5=20)
3      2           40         (because 2*100/5=40)
3      3           60         
3      4           80
3      5           100        (because 5*100/5=100)
9      1           25         (because 1*100/4=25)
9      2           50
9      3           75
9      4           100
3      1           33.33      (because 1*100/3=33.33)
3      2           66.67
3      3           100

Я добавил некоторые вычисления, чтобы вы могу понять, что я пытаюсь вычислить. ВАЖНО: есть несколько строк с одинаковым идентификатором.

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Несколько способов сделать это:

Вы можете разделить amount_ID на max значение amount_ID для уникального вхождения ID.

library(data.table)
setDT(df)[, timespan := amount_ID/max(amount_ID) * 100, rleid(ID)]
df
#    ID amount_ID timespan
# 1:  3         1     20.0
# 2:  3         2     40.0
# 3:  3         3     60.0
# 4:  3         4     80.0
# 5:  3         5    100.0
# 6:  9         1     25.0
# 7:  9         2     50.0
# 8:  9         3     75.0
# 9:  9         4    100.0
#10:  3         1     33.3
#11:  3         2     66.7
#12:  3         3    100.0

Разделите на количество строк в каждой группе.

setDT(df)[, timespan := amount_ID/.N * 100, rleid(ID)]

Разделите на последнее значение amount_ID

setDT(df)[, timespan := amount_ID/last(amount_ID) * 100, rleid(ID)]

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

library(dplyr)
  1. Разделить на максимум

    df %>% 
       group_by(gr = rleid(ID)) %>% 
       mutate(timespan = amount_ID/max(amount_ID) * 100)
    
  2. Разделить на количество строк

    df %>%
      group_by(gr = rleid(ID)) %>%
       mutate(timespan = amount_ID/n() * 100)
    
  3. Разделить на последнее значение

    df %>%
      group_by(gr = rleid(ID)) %>%
      mutate(timespan = amount_ID/last(amount_ID) * 100)
    
0 голосов
/ 17 апреля 2020

Мы можем сделать это за base R

with(df, 100 *amount_ID/ave(amount_ID, with(rle(ID), 
          rep(seq_along(values), lengths)), FUN = max))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...