#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))