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
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)
解决方案
也许可以简化一些步骤,但这是一种方法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
推荐阅读
- javascript - 检查 WebSocket 服务器是否可用且不出错
- web-scraping - 访问/查看网页上的表格
- javascript - 如何在 HTML 中指定内联 Javascript
- python-3.x - 文本到语音 sapi5 python 3.8.6
- php - 使用 Laravel 从 MySQL 中的 JSON 字符串中搜索值
- html - 为什么网站在选择菜单中几乎按字母顺序排序状态是一个常见错误?(例如纽约之前的内华达州)
- assembly - OllyDbg 没有正确解释 SSE2 指令和操作数
- c# - 请求匹配多个端点 SMS API 控制器
- python - 检查每个相似键的每个值是否满足 2 dict - PYTHON 中每个键的条件
- javascript - 捕获异常或消息时如何从哨兵范围获取用户信息