R: ขยายลำดับของค่าไบนารีจากคอลัมน์เวลา

ฉันมีตารางเวลาและค่าไบนารี่

  > head(x,10)
       Time   binary
  1  358.214      1
  2  359.240      1
  3  360.039      0
  4  361.163      0
  5  361.164      1
  6  362.113      1
  7  362.114      0
  8  365.038      0
  9  365.039      0
  10 367.488      0

ฉันต้องการตรวจสอบหลังจากวินาทีว่าค่าในคอลัมน์ไบนารี่เป็น 1 หรือ 0 แล้วสร้างคอลัมน์ใหม่ของค่าใหม่ เวลาที่นี่ไม่ดำเนินต่อไป ตัวอย่างเช่น ค่าแรกที่นี่คือ (358.214) และค่าไบนารี่คือ 1 ถ้าฉันบวกวินาทีมันจะเป็น (359.214) และค่ายังคงเป็น 1 ตามค่าก่อนหน้า เนื่องจาก (359.214) ไม่ได้อยู่ในชุดข้อมูล .

ฉันต้องการเพิ่มสองคอลัมน์ใหม่ หนึ่งคอลัมน์สำหรับวินาทีที่เพิ่มขึ้น และอีกหนึ่งคอลัมน์สำหรับค่าไบนารีใหม่

         time2   new_binary
      1  358.214       1
      2  359.214       1
      3  360.214       0
      4  361.214       1
      5  362.214       0
      6  363.214       0
      7  364.214       0
      8  365.214       0
      9  366.214       0
      10 367.214       0 

ฉันจะทำสิ่งนี้ใน R ได้อย่างไร

ชุดข้อมูล

  Time <- c(358.214, 359.240, 360.039, 361.163, 361.164, 362.113, 362.114, 365.038, 365.039, 367.488, 367.489, 368.763, 368.764, 371.538, 371.539, 384.013, 384.014, 386.088, 386.089, 389.463, 389.464, 392.663, 392.664, 414.588, 414.589, 421.463, 421.464, 427.863, 427.864, 431.488, 431.489, 432.074, 432.075, 437.124, 437.125, 439.024, 439.025, 451.724, 451.725, 456.224, 456.225, 457.301, 457.302, 459.526, 459.527, 470.776, 470.777, 471.951, 471.952, 477.651, 477.652, 479.601, 479.602, 480.426, 480.427, 480.950, 480.951, 494.626, 494.627, 516.551, 516.552, 539.901, 539.902, 545.276, 545.277, 546.536, 546.537, 548.436, 548.437, 551.111, 551.112, 556.086, 556.087, 557.561, 557.562, 567.799, 567.800, 580.049, 580.050, 583.249, 583.250, 587.374, 587.375, 588.599, 588.600, 596.199, 596.200, 597.674, 597.675, 601.249, 601.250, 602.499, 602.500, 620.699, 620.700, 631.099, 631.100, 637.249, 637.250, 638.999, 639.000, 650.574, 650.575, 658.199, 658.200, 658.696, 658.697, 668.396, 668.397, 676.021, 676.022, 678.846, 678.847, 688.121, 688.122, 690.371, 690.372, 701.946, 701.947, 704.921, 704.922, 712.346, 712.347, 719.321, 719.322, 721.146, 721.147, 723.496, 723.497, 725.696, 725.697, 727.121, 727.122, 729.871, 729.872, 733.721, 733.722, 739.054, 758.078, 761.321, 761.322, 764.221, 764.222, 768.679, 768.680, 774.529, 774.530, 776.679, 776.680, 778.129, 778.130, 780.779, 780.780, 837.204, 837.205, 842.079, 842.080, 846.329, 846.330, 847.579)

  binary <- c(1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0 ,0 ,1 ,1, 0, 0, 1, 1, 0, 0, 1, 1 ,0, 0 ,1 ,1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0 ,0 ,1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 ,0 ,0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1)

อัปเดตความพยายามของฉัน:

ก่อนอื่นฉันได้ลำดับวินาทีใหม่ (ซึ่งยาวกว่าเวลาเดิม)

 time2 <- seq(x$Time[1],x$Time[length])

จากนั้นฉันใช้ ifelse เพื่อวนซ้ำ Time และเปรียบเทียบกับ time2 หากค่าใน time2 ไม่เท่ากับค่าในเวลา -› ให้ใส่ค่าไบนารี่ก่อนหน้าของ Time มิฉะนั้นจะได้ค่าไบนารี่ ฉันต้องการฟังก์ชันที่เปรียบเทียบคอลัมน์ความยาวต่างกันสองคอลัมน์ต่อไป

สิ่งที่ฉันทำคือ

     View(vec_new <-data.frame(time2))
     vec_new <- vec_new %>%
     mutate(new_Binary = ifelse((x$Time != vec_new$time2)&(vec_new$time2 %l% x$Time),lag(x$binary), x$binary))

อย่างไรก็ตาม ฉันได้รับคำเตือนนี้เนื่องจากคอลัมน์มีความยาวต่างกัน ความยาวของวัตถุที่ยาวขึ้นไม่ใช่ผลคูณของความยาววัตถุที่สั้นกว่า

อีกทั้งผลลัพธ์ก็ไม่ได้หยุดอย่างที่คาดหวังไว้ ฉันไม่รู้ว่าการวนซ้ำนี้ทำงานอย่างไรผ่านค่าต่างๆ และการวนซ้ำผ่านค่าทั้งหมดอย่างไร ฉันได้ไบนารี่ที่สมบูรณ์จนกระทั่งสิ้นสุดเวลา2

มีความคิดใด ๆ ว่าจะบรรลุสิ่งนี้ใน R ได้อย่างไร?


person Amal Nasir    schedule 01.12.2020    source แหล่งที่มา
comment
ทำไมความยาวของ Time และ binary ถึงแตกต่างกัน? พวกเขาเป็นส่วนหนึ่งของ dataframe เดียวกันหรือไม่? ฉันยังไม่ชัดเจนว่าคุณสร้าง time2 และ new_binary อย่างไร   -  person Ronak Shah    schedule 02.12.2020
comment
คำถามที่ดี! เป้าหมายคือการสร้างลำดับใหม่เป็น 0/1 ข้อมูลต้นฉบับคือเวลาและไบนารี่ จากนี้ ฉันต้องการขยายเวลาตามค่าไบนารี่เพื่อวัดความยาวของ 1 ฉันได้ time2 และ new_binary หลังจากที่ฉันขยายเวลาให้ห่างกัน 1 วินาที จากนั้นสร้างลำดับใหม่เป็น 1/0 ตามค่าที่สอดคล้องกันของไบนารีดั้งเดิม ตัวอย่างเช่น 358.214 = 1, 359.214 ยังคงเป็น =1 แต่ 360.214 อยู่ระหว่าง 360.039 & 361.163 และเป็น = 0 และต่อๆ ไป   -  person Amal Nasir    schedule 02.12.2020
comment
คุณลบเครื่องหมายจุลภาคทั้งหมดออกจากข้อมูล Time ซึ่งส่งคืนข้อผิดพลาด   -  person Ronak Shah    schedule 02.12.2020
comment
@RonakShah อัปเดตคำถามของฉันและโพสต์ความพยายามของฉัน   -  person Amal Nasir    schedule 02.12.2020


คำตอบ (1)


หากคุณใช้ mutate จากแพ็คเกจ dplyr วิธีแก้ปัญหานั้นค่อนข้างง่าย:

library(dplyr)
df <- data.frame(Time, binary) %>%
  mutate(Time=Time-Time[1]) %>%
  mutate(binary=as.logical(binary))

เอาท์พุต

head(df)
# Time binary
# 1 0.000   TRUE
# 2 1.026   TRUE
# 3 1.825  FALSE
# 4 2.949  FALSE
# 5 2.950   TRUE
# 6 3.899   TRUE

หากคุณต้องการสร้างคอลัมน์ใหม่ คุณเพียงแค่ต้องตั้งชื่อใหม่ให้กับคอลัมน์เหล่านั้น

df <- data.frame(Time, binary) %>%
     mutate(time2=Time-Time[1]) %>%
     mutate(new_binary=as.logical(binary))

เอาท์พุต

head(df)
#      Time binary time2 new_binary
# 1 358.214      1 0.000       TRUE
# 2 359.240      1 1.026       TRUE
# 3 360.039      0 1.825      FALSE
# 4 361.163      0 2.949      FALSE
# 5 361.164      1 2.950       TRUE
# 6 362.113      1 3.899       TRUE

และวิธีนี้จะให้เวลาแก่คุณตามผลลัพธ์ที่คุณต้องการ (ฉันหวังว่า)

df <- data.frame(Time, binary) %>%
     mutate(time2=as.numeric(rownames(df))+357.214) %>%
     mutate(new_binary=as.logical(binary))
head(df)

เอาท์พุต

head(df)
#      Time binary   time2 new_binary
# 1 358.214      1 358.214       TRUE
# 2 359.240      1 359.214       TRUE
# 3 360.039      0 360.214      FALSE
# 4 361.163      0 361.214      FALSE
# 5 361.164      1 362.214       TRUE
# 6 362.113      1 363.214       TRUE
person Mario Niepel    schedule 03.12.2020
comment
ขอบคุณ! แต่คำตอบของคุณให้เลขฐานสองเหมือนกัน ฉันจะได้รับผลลัพธ์เดียวกัน (time2, new_binary) ที่ฉันคาดหวังได้อย่างไร - person Amal Nasir; 03.12.2020
comment
คุณเพียงแค่ต้องตั้งชื่อใหม่ให้กับผลลัพธ์ในฟังก์ชันกลายพันธุ์ ฉันแก้ไขคำตอบของฉัน หากคุณไม่ต้องการเก็บสองคอลัมน์แรกไว้ ให้ใช้วิธีการแก้ไขปัญหาแรกที่ฉันโพสต์และเปลี่ยนชื่อคอลัมน์เป็น time2 และ new_binary หลังฟังก์ชันกลายพันธุ์ - person Mario Niepel; 03.12.2020
comment
ที่จริงแล้ว เมื่อลองคิดดูแล้ว ฉันไม่ได้เพิ่งรู้ว่าฉันผิดเวลา ขอฉันแก้ไขเรื่องนี้ด้วย - person Mario Niepel; 03.12.2020
comment
ฉันคิดว่าโซลูชันเหล่านี้คุณควรจะสามารถเลือกสิ่งที่คุณต้องการอย่างแท้จริงเป็นผลลัพธ์และนำไปต่อยอดได้ - person Mario Niepel; 03.12.2020