Saya ingin mengembalikan posisi variabel dari bingkai data. Data dengan memiliki serial (nomor identifikasi), Day1 (hari minggu dari Senin-Minggu) yang mencatat hari mulai pengamatan dan 7 variabel day1 sampai day7 masing-masing mewakili hari dalam seminggu. Day1 adalah Sen dan Day7 adalah Sun.

Ada variabel WkDay2 lain yang digunakan untuk mencatat posisi pengamatan selama seminggu.

Saya ingin mengidentifikasi posisi pengamatan apa pun. Hari mulai dicatat dalam WkDay1. Misalnya dalam kasus id 12 pengamatan dimulai pada hari Senin dan pengamatan baru dicatat pada hari Rabu - pada hari ketiga. Dalam kasus id 123 pengamatan dilakukan pada hari Selasa dan pengamatan baru dicatat pada hari yang sama - atau hari pertama. Terakhir, id 10, pengamatan dilakukan pada hari Kamis dan baru pada hari ke-4 (setelah WDay1) atau Minggu.

Memasukkan:

  serial  day1 day2 day3 day4 day5 day6 day7 WkDay1 WkDay2
    12    2    1    2    1    1    3    1   Monday   Wednesday
   123    0    3    0    3    3    0    3   Tuesday  Tuesday
    10    0    3    3    3    3    3    3   Thursday Sunday

Keluaran:

serial  Position
    12      Third    
    123     First  
    10      Fourth
1
Rfanatic 18 April 2020, 00:23

1 menjawab

Jawaban Terbaik

Kita dapat membuat pemetaan dengan vektor 'wkdays' menggunakan match, kemudian dengan Map, dapatkan urutan dari 'WkDay1' ke 'WkDay2', centang length dan ubah menjadi ordinal (dari english)

library(english)
wkday <- c("Monday", "Tuesday", "Wednesday", "Thursday",
              "Friday", "Saturday", "Sunday")
m1 <- match(df1$WkDay1, wkday)
m2 <- match(df1$WkDay2, wkday)
Position <- unlist( Map(function(i, j, x) as.character(ordinal(length(i:j))),
             m1, m2, asplit(df1[startsWith(names(df1), "day")], 1)))
cbind(df1['serial'], Position = tools::toTitleCase(Position))
# serial Position
#1     12    Third
#2    123    First
#3     10   Fourth

Atau dengan tidyverse

library(dplyr)
library(tidyr)
df1 %>% 
     pivot_longer(cols = starts_with('day'), names_to = 'day') %>% 
     filter(value  > 0) %>%
     group_by(serial) %>%
     summarise(Position = tools::toTitleCase(as.character(ordinal(length(
          match(first(WkDay1), 
          wkday):match(first(WkDay2), wkday))))))
# A tibble: 3 x 2
#   serial Position
#    <int> <chr>   
#1     10 Fourth  
#2     12 Third   
#3    123 First   

Data

df1 <- structure(list(serial = c(12L, 123L, 10L), day1 = c(2L, 0L, 0L
), day2 = c(1L, 3L, 3L), day3 = c(2L, 0L, 3L), day4 = c(1L, 3L, 
3L), day5 = c(1L, 3L, 3L), day6 = c(3L, 0L, 3L), day7 = c(1L, 
3L, 3L), WkDay1 = c("Monday", "Tuesday", "Thursday"),
WkDay2 = c("Wednesday", 
"Tuesday", "Sunday")), class = "data.frame", row.names = c(NA, 
-3L))
1
akrun 17 April 2020, 22:04