나는 데이터 세트가 있는데, 평일과 주말이 러시아워에 충돌을 일으키고 싶습니다. (시뮬레이션 데이터입니다)
data11 <- structure(list(dow = structure(c(6L, 4L, 2L, 7L, 5L, 6L), .Label = c("1", "2", "3", "4", "5", "6", "1"), class = "factor"),
time = c(0L, 1655L, 53L, 447L, 2000L, 1224L), sun1 = c(0, 0, 0, 0, 0, 0), sun2 = c(0, 0, 0, 0, 0, 0), sun = c(0, 0, 0, 0, 0, 0)), row.names = c(NA, 6L), class = "data.frame")
나는 이것을 아침 (1)과 밤 (2) 러시아워 등 (0)을 만드는 데 사용했습니다. 그러나 여기에는 말이되지 않는 주말도 포함됩니다.
data12=data11%>%mutate(crstime1=ifelse(630<time & time<830,1,0))%>%
mutate(crstime2=ifelse(1650<time & time<1830,2,0))
data12$crstime3=(data12$crstime1+data12$crstime2)
table(data12$crstime3)
0 1 2
86 7 7
주말에 다른 시간을 사용하고 싶습니다 (요일 (다우) = 6 및 7). 이런 코드로 할 수 있지만 고문이 될 것입니다.
> data11=data11%>%mutate(sun1=ifelse(dow=="7" & 1100<time & time<1259,1,0))%>%
+ mutate(sun2=ifelse(dow=="7"& 1800<time & time<2059,2,0))
> data11$sun=(data11$sun1+data11$sun2)
> table(data11$sun)
0 1 2
96 2 2
> dplyr::filter(data11,dow=="7")
dow time sun1 sun2 sun
1 7 447 0 0 0
2 7 1751 0 0 0
3 7 330 0 0 0
4 7 0 0 0 0
5 7 216 0 0 0
6 7 1256 1 0 1
7 7 0 0 0 0
8 7 2032 0 2 2
9 7 1213 1 0 1
10 7 2030 0 2 2
11 7 323 0 0 0
12 7 300 0 0 0
13 7 843 0 0 0
14 7 53 0 0 0
내 마지막 질문은 시간을 시간 객체로 변환 할 수 없다는 것입니다. 그것은 정수이고 완벽하게 작동하지만 방법을 배우고 싶습니다. 윤활제를 시도했지만 실패했습니다.
> data11$dow
[1] 6 4 2 7 5 3 1 5 1 3 7 4 1 6 3 3 5 3 7 3 3 6 2 1 2 3 6 2 6 7 6 7 6 7 6 7 4 2 1 7 6 1 2 5 1 1 5 7 6 3 4 1 6 7 5 6 6 6 6 4 6 3 6 3
[65] 3 5 2 1 2 3 5 4 1 4 1 7 5 7 1 2 6 2 4 5 1 5 2 2 2 1 4 6 7 4 5 1 4 5 6 7
Levels: 1 2 3 4 5 6 7
> data11$time
[1] 2203 1632 2115 447 2000 1424 30 1324 723 2105 1751 743 1854 1000 1327 1105 135 1815 330 1845 1546 1752 936 1643 1410
[26] 1448 1630 942 2145 0 1500 216 1456 1256 1236 0 2037 1640 0 2032 1715 801 1219 2140 25 318 2234 1213 2230 2024
[51] 2327 2048 315 2030 1830 2148 317 1338 2233 2348 220 1746 1334 2006 829 1345 2004 1907 2004 1200 1010 2030 954 809 1502
[76] 323 1904 300 1310 1837 131 1520 820 1313 1529 1859 1600 1105 1821 1229 2052 1852 843 759 1609 1435 1722 1934 1225 53
나는 당신이 원하는 것을 올바르게 이해하고 있는지 확실하지 않지만 여기에 시도해보십시오. 정의를 time
사용하여 올바른 형식 stringr::str_pad
과 lubridate::hm
다음 정상을dplyr::case_when
library(dplyr)
library(lubridate)
data11 %>% mutate(time1 = stringr::str_pad(time, side="left", pad = "0", width = 4),
time2 = hm(paste0(substr(time1,1,2),':',substr(time1,3,4))),
crstime = case_when(!dow %in% c(6,7) & time2 > hm("06:30") & time2 < hm("08:30") ~ 1,
!dow %in% c(6,7) & time2 > hm("16:50") & time2 < hm("18:30") ~ 2,
dow %in% c(6,7) & time2 > hm("11:00") & time2 < hm("12:59") ~ 3,
dow %in% c(6,7) & time2 > hm("18:00") & time2 < hm("20:59") ~ 4,
TRUE ~ 0))
dow time sun1 sun2 sun time1 time2 crstime
1 6 0 0 0 0 0000 0S 0
2 4 1655 0 0 0 1655 16H 55M 0S 2
3 2 53 0 0 0 0053 53M 0S 0
4 1 447 0 0 0 0447 4H 47M 0S 0
5 5 2000 0 0 0 2000 20H 0M 0S 0
6 6 1224 0 0 0 1224 12H 24M 0S 3
추신 : data11
모든 가능성 / 조합을 포함하도록 업데이트 했습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다