การสร้างตัวแปรใหม่ตามลำดับของตัวแปรที่มีอยู่โดยใช้ R

หวังจะสร้างตัวแปร X ใหม่โดยอิงจากตัวแปรที่มีอยู่ 3 ตัว ได้แก่ "SubID" "วัน" และ "เวลา" ฉันเคยมีฟังก์ชันการเรียงลำดับสามฟังก์ชันใน 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 และไม่รู้ว่าต้องทำอย่างไร ขอบคุณล่วงหน้า!


person Susan    schedule 16.03.2019    source แหล่งที่มา


คำตอบ (2)


อาจมาพร้อมกับแพ็คเกจ 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
person DJJ    schedule 16.03.2019
comment
ขอบคุณมากสำหรับคำอธิบายโดยละเอียด! พวกเขามีประโยชน์มาก! - person Susan; 17.03.2019

อาจช่วยได้

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))
person akrun    schedule 16.03.2019
comment
รหัสทำงาน แต่เมื่อฉันไปตรวจสอบตัวแปรใหม่ X1 แล้ว R บอกว่ามันเป็นโมฆะ หมายความว่าฉันยังไม่ได้สร้างตัวแปรขึ้นมาใหม่เหรอ? ขออภัยสำหรับคำถามโง่ๆ นี้ ฉันเพิ่งเคยใช้ R รหัสที่ฉันใช้คือ: data2 %›% group_by(SubID) %›% mutate(X1 = order(Day, Time)) data2$X1 - person Susan; 16.03.2019
comment
@Susan คุณต้องกำหนดให้กับ data เช่น data2 <- data2 %>% group_by(SubID) %>% mutate(X1 = order(Day, Time)) - person akrun; 16.03.2019