Создание нового столбца на основе значений в других столбцах и факторной переменной - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть следующая таблица, которая содержит факторную переменную 'category' с двумя уровнями DH1 и DH2.У меня также есть интервальные значения для факторной переменной «от» и «до».

category = c('DH1','DH1','DH1','DH1','DH2','DH2')
from = c(356,366,367,368,401,402)
to = c(366,367,368,369,402,403)

df <- data.frame(category,from, to)

  category from  to
1      DH1  365 366
2      DH1  366 367
3      DH1  367 368
4      DH1  368 369
5      DH2  401 402
6      DH2  402 403

Мне нужно создать два новых столбца, которые могут выглядеть следующим образом, где, как только DH1 меняется на DH2, from1 начинается с 0 и to1 = to-from

  category from  to from1 to1
1      DH1  365 366     0   1
2      DH1  366 367     1   2
3      DH1  367 368     2   3
4      DH1  368 369     3   4
5      DH2  401 402     0   1
6      DH2  402 403     1   2

Я понимаю, что мне нужно иметь цикл for и проходить через категорию, затем иметь оператор if category[4] != category[5] и на основании этого вычислять новые столбцы.Но есть ли более простой способ сделать это?

Ответы [ 3 ]

3 голосов
/ 04 апреля 2019

Существует простой способ использования library(dplyr):

df %>% arrange(category, from) 
  %>% group_by(category) 
  %>% mutate(from1 = row_number()-1, to1 = row_number())

. Он сортирует данные по category и from и группирует по переменной category, чтобы убедиться, что from1 и to1 могут бытьна основе номеров строк для категории с помощью функции mutate, которая используется для создания новых переменных.

2 голосов
/ 04 апреля 2019

Может быть, вы ищете

library(dplyr)

df %>%
  group_by(category) %>%
  mutate(from1 = row_number() - 1, 
          to1 = cumsum(to - from))


#  category  from    to from1   to1
#  <fct>    <dbl> <dbl> <dbl> <dbl>
#1 DH1        365   366     0     1
#2 DH1        366   367     1     2
#3 DH1        367   368     2     3
#4 DH1        368   369     3     4
#5 DH2        401   402     0     1
#6 DH2        402   403     1     2

Для каждого category это присваивает row_number() - 1 значение from1 и вычисляет кумулятивную сумму to - from значений. Если category не упорядочен и DH1 может появиться снова в качестве другой группы, нам может понадобиться group_by data.table::rleid(category).

1 голос
/ 04 апреля 2019

Если вы нумеруете 1..n в каждой категории, вы можете использовать пакет "dplyr":

library(dplyr)
df %>% group_by(category) %>% mutate(to1=1:n(), from1=to1-1)

Если вы пытаетесь сравнить значение в строке i со строкой i + 1, вы можете использовать функцию lag, также из "dplyr" (встроенная функция lag работает только для временных рядов):

dplyr::lag(df$category)
[1] <NA> DH1  DH1  DH1  DH1  DH2 
Levels: DH1 DH2

(как только вы загрузите пакет "dplyr", он заменит встроенную функцию lag, и вам не нужно будет вызывать ее, как я писал в примере - это просто для того, чтобы подчеркнуть, какую функцию я Я имею в виду)

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