R 与给定变量的距离

R 与给定变量的距离,r,dataframe,R,Dataframe,我想从数据帧返回变量的位置。具有的数据有一个序列号(标识号),Day1(从周一到周日的一周天数)记录观察的开始日期,以及7个变量Day1到day7,每个变量表示一周中的一天。第一天是周一,第七天是太阳 还有一个WkDay2变量用于记录一周内观察的位置 我想确定任何观察的位置。开始日期记录在工作日1中。例如,在id 12的情况下,观察从周一开始,周三(第三天)记录了一个新的观察。在ID123的案例中,观察开始于周二,并在同一天或第一天记录了新的观察结果。最后,id 10,在周四进行观察,并在第4天

我想从数据帧返回变量的位置。具有的数据有一个序列号(标识号),Day1(从周一到周日的一周天数)记录观察的开始日期,以及7个变量Day1到day7,每个变量表示一周中的一天。第一天是周一,第七天是太阳

还有一个WkDay2变量用于记录一周内观察的位置

我想确定任何观察的位置。开始日期记录在工作日1中。例如,在id 12的情况下,观察从周一开始,周三(第三天)记录了一个新的观察。在ID123的案例中,观察开始于周二,并在同一天或第一天记录了新的观察结果。最后,id 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

我们可以使用
match
创建带有“wkdays”向量的映射,然后使用
Map
,获取从“WkDay1”到“WkDay2”的序列,检查
长度
,并将其转换为
序号
(来自
英语

数据
df1
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
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))