Создание новой переменной на основе порядков существующих переменных с использованием R

#r #variables #time-series

#r #переменные #временные ряды

Вопрос:

Надеемся создать новую переменную X на основе трех существующих переменных: «SubID», «Day» и «Time». Раньше у меня были три функции сортировки в Excel, чтобы делать это вручную: сначала сортировка по «SubID», затем сортировка по «Дню» и, наконец, сортировка по «Времени». X должно составлять от 1 до наибольшего количества строк для каждого SubID, в зависимости от порядка дня и времени.

SubID: присвоенный номер объекта

День: номер дня каждого субъекта (1,2,3…21)

Время: 1, 2, 3

X: количество строк, помеченных как один и тот же SubID

 SubID Day  Time   X    
 1    1     1     1
 1    1     2     2
 1    1     3     3
 1    2     1     4
 1    2     2     5
 2    1     1     1
 2    1     2     2
 2    1     3     3
 2    2     3     6
 2    2     2     5
 2    2     1     4
  

Я делал это вручную в Excel, и я уверен, что должен быть более разумный способ сделать это в R, но я новичок в R и не знаю как. Заранее благодарю вас!

Ответ №1:

Может быть с пакетом data.table. Вам нужно будет установить ее, если вы еще этого не сделали. Я прокомментировал команду.

 # install.packages("data.table")
library(data.table)
  

мы можем сгенерировать ваши данные следующим образом.

 df <- data.frame(SubId=sample(1:2,10,replace=TRUE),
                 Day=sample(1:2,10,replace=TRUE),
                     Time=sample(1:2,10,replace=TRUE))
  

Затем преобразуйте data.frame в data.table.

 setDT(df)
##> df
##     SubId Day Time
##  1:     1   2    1
##  2:     1   1    1
##  3:     1   1    2
##  4:     2   2    1
##  5:     2   1    1
##  6:     1   2    2
##  7:     1   2    1
##  8:     1   2    2
##  9:     2   1    1
## 10:     2   1    2
  

Наконец, мы можем упорядочить мой SubID, день, время. Поскольку таблица упорядочена так, как мы хотели, нам просто нужно пронумеровать строки от 1 до количества наблюдений в каждом SubID.

 df[order(SubId,Day,Time),X:=1:.N,SubId]


##> df
##    SubId Day Time X
## 1:     1   2    1 3
## 2:     1   1    1 1
## 3:     1   1    2 2
## 4:     2   2    1 4
## 5:     2   1    1 1
## 6:     1   2    2 5
## 7:     1   2    1 4
## 8:     1   2    2 6
## 9:     2   1    1 2
## 10:    2   1    2 3
  

Комментарии:

1. Большое вам спасибо за подробные объяснения! Они очень полезны!

Ответ №2:

Может быть, это помогает

 library(dplyr)
df1 %>% 
  group_by(SubID) %>% 
  mutate(X1 = row_number(as.numeric(paste0(Day, Time))))
# A tibble: 11 x 5
# Groups:   SubID [2]
#   SubID   Day  Time     X    X1
#   <int> <int> <int> <int> <int>
# 1     1     1     1     1     1
# 2     1     1     2     2     2
# 3     1     1     3     3     3
# 4     1     2     1     4     4
# 5     1     2     2     5     5
# 6     2     1     1     1     1
# 7     2     1     2     2     2
# 8     2     1     3     3     3
# 9     2     2     3     6     6
#10     2     2     2     5     5
#11     2     2     1     4     4
  

Или с использованием order

 df1 %>% 
  group_by(SubID) %>% 
  mutate(X1 = order(Day, Time))
  

Или с помощью data.table

 library(data.table)
setDT(df1)[, X1 := order(Day, Time), by = SubID]
  

данные

 df1 <- structure(list(SubID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L), Day = c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L), 
Time = c(1L, 2L, 3L, 1L, 2L, 1L, 2L, 3L, 3L, 2L, 1L), X = c(1L, 
2L, 3L, 4L, 5L, 1L, 2L, 3L, 6L, 5L, 4L)), class = "data.frame", 
 row.names = c(NA, 
   -11L))
  

Комментарии:

1. Коды выполнялись, но когда я пошел проверять новую переменную X1, R сказал, что это «null». То есть я еще не воссоздал переменную? Извините за этот глупый вопрос, я новичок в R. Я использовал следующие коды: data2 %>% group_by(SubID) %>% mutate(X1 = порядок (день, время)) data2 $ X1

2. @Susan Вам нужно присвоить ее данным, т.Е. data2 <- data2 %>% group_by(SubID) %>% mutate(X1 = order(Day, Time))