R——在不使用循环的情况下移动数据帧中的多行

R——在不使用循环的情况下移动数据帧中的多行,r,R,我想知道是否有任何方法可以在R中不使用循环来执行行的移动?我有一台机器的数据,它可以执行不同长度的连续作业。我想改变数据,这样周末就不会有工作了 轮班前的数据 Date Job 1 2019-12-1 Job1 2 2019-12-2 Job1 3 2019-12-3 Job2 4 2019-12-4 Job2 5 2019-12-5 Job2 6 2019-12-6 Job3 7 2019-12-7 Job3 8 2019-12-8 NA

我想知道是否有任何方法可以在R中不使用循环来执行行的移动?我有一台机器的数据,它可以执行不同长度的连续作业。我想改变数据,这样周末就不会有工作了

轮班前的数据

        Date  Job
1   2019-12-1 Job1
2   2019-12-2 Job1
3   2019-12-3 Job2
4   2019-12-4 Job2
5   2019-12-5 Job2
6   2019-12-6 Job3
7   2019-12-7 Job3
8   2019-12-8   NA
9   2019-12-9   NA
10 2019-12-10   NA
班后数据

         Date  Job Day_Of_Week
1  2019-12-01   NA      Sunday
2  2019-12-02 Job1      Monday
3  2019-12-03 Job1     Tuesday
4  2019-12-04 Job2   Wednesday
5  2019-12-05 Job2    Thursday
6  2019-12-06 Job2      Friday
7  2019-12-07   NA    Saturday
8  2019-12-08   NA      Sunday
9  2019-12-09 Job3      Monday
10 2019-12-10 Job3     Tuesday
脚本:

data=data.frame(
                     Date=c("2019-12-1","2019-12-2","2019-12-3","2019-12-4","2019-12-5","2019-12-6","2019-12-7","2019-12-8","2019-12-9","2019-12-10"), 
                     Job=c("Job1","Job1","Job2","Job2","Job2","Job3","Job3",NA,NA,NA)
                     )


  data$Date <- as.Date(data$Date, "%y-%m-%d") 
  data$Day_Of_Week<- weekdays(as.Date(data$Date))
  data$Job<-as.character(data$Job)

  lower_data<-NA
  upper_data<-NA


  for ( row in 1:nrow(data)){


    if(data[row,"Day_Of_Week"] %in% c('Saturday','Sunday')){
      if(row>1){
        upper_data <- data[1:row-1,]
        lower_data <- data[row:nrow(data),]
        lower_data <- transform(lower_data, Job = c(NA, Job[-nrow(lower_data)]))
        lower_data$Date<- as.Date(lower_data$Date, "%y-%m-%d" )
        data<-rbind(upper_data,lower_data)
      }else{
        data <- transform(data, Job = c(NA, Job[-nrow(data)]))
        data$Date<- as.Date(data$Date, "%y-%m-%d" )

      }


      } 

  }

  View(data)
data=data.frame(
日期=c(“2019-12-1”、“2019-12-2”、“2019-12-3”、“2019-12-4”、“2019-12-5”、“2019-12-6”、“2019-12-7”、“2019-12-8”、“2019-12-9”、“2019-12-10”),
作业=c(“作业1”、“作业1”、“作业2”、“作业2”、“作业2”、“作业3”、“作业3”,不适用,不适用)
)

data$Date也许可以简化一些步骤,但这里有一种方法是使用
dplyr

library(dplyr)

data %>%
  mutate(Date = as.Date(Date), 
         Day_Of_Week = weekdays(Date), 
         is_weekend = cumsum(Day_Of_Week %in% c('Saturday', 'Sunday')),
         New_index = row_number() - is_weekend,
         New_index = replace(New_index, New_index == 0 | 
                             Day_Of_Week %in% c('Saturday', 'Sunday'), NA),
         New_Job = Job[New_index]) %>%
  select(-is_weekend, New_index)

#         Date  Job Day_Of_Week New_index New_Job
#1  2019-12-01 Job1      Sunday        NA    <NA>
#2  2019-12-02 Job1      Monday         1    Job1
#3  2019-12-03 Job2     Tuesday         2    Job1
#4  2019-12-04 Job2   Wednesday         3    Job2
#5  2019-12-05 Job2    Thursday         4    Job2
#6  2019-12-06 Job3      Friday         5    Job2
#7  2019-12-07 Job3    Saturday        NA    <NA>
#8  2019-12-08 <NA>      Sunday        NA    <NA>
#9  2019-12-09 <NA>      Monday         6    Job3
#10 2019-12-10 <NA>     Tuesday         7    Job3
库(dplyr)
数据%>%
变异(日期=as.Date(日期),
周中日=工作日(日期),
is_weekend=cumsum(一周中的天百分比,单位为%c(‘周六’、‘周日’),
新索引=行编号()-是周末,
新_指数=替换(新_指数,新_指数==0 |
周中的第天%c('星期六','星期日'),NA),
新建作业=作业[新建索引]%>%
选择(-is_weekend,New_index)
#日期工作日每周新工作索引新工作
#2019年12月1日星期日不适用
#2 2019-12-02工作1周一工作1
#3 2019-12-03工作2星期二2工作1
#4 2019-12-04作业2周三3作业2
#5 2019-12-05作业2周四4作业2
#6 2019-12-06工作3周五5工作2
#7 2019-12-07工作3周六不适用
#8 2019-12-08星期日北美
#9 2019-12-09星期一6工作3
#10 2019-12-10星期二7月3日