R: memperluas urutan nilai biner dari kolom waktu

Saya memiliki tabel waktu dan nilai biner,

  > 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

Saya ingin memeriksa setelah beberapa saat apakah nilai dalam kolom biner adalah 1 atau 0, dan kemudian membuat kolom baru dengan nilai baru. Waktu di sini tidak berlanjut. Misal nilai pertama disini adalah (358.214) dan nilai binernya adalah 1, jika saya tambahkan yang kedua akan menjadi (359.214) dan nilainya tetap 1 berdasarkan nilai sebelumnya karena (359.214) tidak ada di dataset .

Saya ingin menambahkan dua kolom baru, satu untuk bertambahnya detik dan satu lagi untuk nilai biner baru.

         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 

Bagaimana saya bisa melakukan ini di R?

Kumpulan data,

  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)

Perbarui upaya saya:

Pertama saya mendapat urutan detik baru (yang lebih panjang dari Waktu aslinya)

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

Kemudian saya menggunakan ifelse untuk mengulang Waktu dan membandingkannya dengan waktu2, jika nilai dalam waktu2 tidak sama dengan nilai dalam Waktu -› masukkan nilai biner Waktu sebelumnya, jika tidak, dapatkan nilai biner. Jadi saya ingin fungsi yang terus membandingkan dua kolom dengan panjang berbeda.

Apa yang saya lakukan adalah ini,

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

Namun, saya mendapat peringatan ini karena panjang kolom yang berbeda. panjang benda yang lebih panjang bukan kelipatan panjang benda yang lebih pendek

Selain itu, hasilnya tidak sesuai dengan apa yang saya harapkan. Saya tidak tahu bagaimana loop ini bekerja melalui nilai-nilai dan bagaimana loop melalui semua nilai. Saya mendapatkan biner lengkap hingga akhir waktu2.

Adakah yang tahu bagaimana mencapai ini di R?


person Amal Nasir    schedule 01.12.2020    source sumber
comment
Mengapa panjang Time dan binary berbeda? Apakah mereka bagian dari kerangka data yang sama? Juga tidak jelas bagi saya bagaimana Anda membuat time2 dan new_binary.   -  person Ronak Shah    schedule 02.12.2020
comment
Pertanyaan bagus! Tujuannya di sini adalah untuk membuat barisan baru 0/1. Data aslinya adalah Waktu dan biner. Dari sini, saya ingin memperluas waktu berdasarkan nilai biner untuk mengukur panjang angka 1. Saya mendapatkan time2 dan new_binary setelah saya memperluas waktu menjadi 1 detik, dan kemudian membuat urutan baru 1/0 berdasarkan nilai yang sesuai dari biner asli. Misal 358.214 = 1, 359.214 tetap =1 tetapi 360.214 berada di antara 360.039 & 361.163 dan = 0 dan seterusnya.   -  person Amal Nasir    schedule 02.12.2020
comment
Anda menghapus semua koma dari Time data yang menghasilkan kesalahan.   -  person Ronak Shah    schedule 02.12.2020
comment
@RonakShah memperbarui pertanyaan saya dan memposting upaya saya.   -  person Amal Nasir    schedule 02.12.2020


Jawaban (1)


Jika Anda menggunakan mutate dari paket dplyr solusinya relatif mudah:

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

Keluaran

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

Jika Anda ingin membuat kolom baru, Anda cukup memberinya nama baru.

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

Keluaran

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

Dan solusi ini memberi Anda waktu sesuai dengan hasil yang Anda inginkan (saya harap).

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

Keluaran

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
Terima kasih! Tapi jawaban Anda memberikan biner yang sama. Bagaimana saya bisa mendapatkan hasil yang sama (time2, new_binary) yang saya harapkan? - person Amal Nasir; 03.12.2020
comment
Anda hanya perlu memberi nama baru pada hasil fungsi mutate. Saya mengedit tanggapan saya. Jika Anda tidak ingin mempertahankan dua kolom pertama, ambil saja solusi pertama yang saya posting dan ganti nama kolom menjadi time2 dan new_binary setelah fungsi mutate. - person Mario Niepel; 03.12.2020
comment
Sebenarnya, kalau dipikir-pikir, aku tidak sadar kalau aku salah menentukan waktu. Biarkan saya memperbaikinya juga. - person Mario Niepel; 03.12.2020
comment
Saya pikir dengan solusi ini Anda harus dapat memilih apa yang benar-benar Anda inginkan sebagai keluaran dan mengambilnya dari sana. - person Mario Niepel; 03.12.2020