Расстояние от заданной переменной - PullRequest
1 голос
/ 18 апреля 2020

Я хотел бы вернуть положение переменной из фрейма данных. Данные с серийными номерами (идентификационный номер), Day1 (дни недели с понедельника по воскресенье), в которых записывается начальный день наблюдения, и 7 переменных с дня от 1 до дня 7, каждый из которых представляет день недели. Day1 - Mon, а Day7 - Sun.

Существует еще одна переменная WkDay2, которая используется для записи позиции наблюдения в течение недели.

Я хотел бы определить позицию любого наблюдения. Стартовый день записывается в WkDay1. Например, в случае идентификатора 12 наблюдение началось в понедельник, а новое наблюдение было зафиксировано в среду - в третий день. В случае идентификатора 123 наблюдение началось во вторник, и новое наблюдение было записано в тот же день или в первый день. Наконец, идентификатор 10, наблюдение было сделано в четверг и новое в 4-й день (после WDay1) или воскресенье.

Ввод:

  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

Выход:

serial  Position
    12      Third    
    123     First  
    10      Fourth

1 Ответ

1 голос
/ 18 апреля 2020

Мы можем создать отображение с вектором 'wkdays', используя match, затем с помощью Map, получить последовательность от 'WkDay1' до 'WkDay2', проверить length и преобразовать ее в ordinal ( от 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

Или с 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   

данные

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...