ฉันมีกรอบข้อมูลติดตั้งดังนี้:
df <- data.frame("id" = c(111,111,111,222,222,222,222,333,333,333,333),
"Location" = c("A","B","A","A","C","B","A","B","A","A","A"),
"Encounter" = c(1,2,3,1,2,3,4,1,2,3,4))
id Location Encounter
1 111 A 1
2 111 B 2
3 111 A 3
4 222 A 1
5 222 C 2
6 222 B 3
7 222 A 4
8 333 B 1
9 333 A 2
10 333 B 3
11 333 A 4
ฉันกำลังพยายามสร้างแฟล็กไบนารีที่ตั้งอยู่ใน Encounter ก่อนหน้าสำหรับแต่ละกลุ่ม id ดังนั้นมันจะมีลักษณะ:
id Location Encounter Flag
1 111 A 1 0
2 111 B 2 0
3 111 A 3 1
4 222 A 1 0
5 222 C 2 0
6 222 B 3 0
7 222 A 4 1
8 333 B 1 0
9 333 A 2 0
10 333 B 3 1
11 333 A 4 1
ฉันพยายามคิดว่าจะทำคำสั่ง if เช่น:
library(dplyr)
df$Flag <- case_when((df$id - lag(df$id)) == 0 ~
case_when(df$Location == lag(df$Location, 1) |
df$Location == lag(df$Location, 2) |
df$Location == lag(df$Location, 3) ~ 1, T ~ 0), T ~ 0)
id Location Flag
1 111 A 0
2 111 B 0
3 111 A 1
4 222 A 0
5 222 C 0
6 222 B 0
7 222 A 1
8 333 B 0
9 333 A 1
10 333 B 1
11 333 A 1
แต่นี่เป็นปัญหาที่แถวที่ 9 ได้รับมอบหมายอย่างไม่ถูกต้อง 1 และมีบางกรณีที่มีการเผชิญหน้า 15 ครั้งในข้อมูลจริงดังนั้นนี่จึงค่อนข้างยุ่งยาก ฉันหวังว่าจะหาวิธีที่จะทำสิ่งที่ต้องการ
lag(df$Location, 1:df$Encounter)
แต่ฉันรู้ว่าlag()
ต้องการจำนวนเต็มสำหรับ k ดังนั้นคำสั่งเฉพาะจะไม่ทำงาน
ยินดีต้อนรับสู่ Stack Overflow! เพียงเพราะคุณถามหาข้อมูลเชิงลึกเกี่ยวกับการปฏิบัติเช่นนั้นคุณอาจต้องการที่จะอ่านเกี่ยวกับเรื่องนี้ว่าจะทำอย่างไรเมื่อมีคนตอบคำถามของคุณ นอกจากนั้นไม่ใช่ความคิดที่ดีที่จะออกทัวร์และอ่านวิธีถาม (คำถามของคุณยอดเยี่ยม แต่มันจะให้ตรากับคุณ) หวังว่าจะได้พบคุณที่นี่บ่อยขึ้น ไชโย
—
M--