여럿사람들의 스케쥴 조정하기 어려울 때가 있습니다. 스케쥴을 조합해놓고 빈 시간을 찾아야 하는데 자료수집부터 만만치 않습니다.
자료수집끝마치게 되고 되는시간이 많다면 또 조정하기 어렵습니다.
이럴땐 다른 사람들의 고정 스케쥴만 안다면 스케쥴 조정하기 쉽게 프로그래밍을 하실 수 있습니다.
위의 schedule.csv로 진행하겠습니다.
#path:자신의 csv파일 경로
df <- read.csv('path/schedule.csv',fileEncoding = 'CP949')
> df
X 월 화 수 목 금
1 9 1,2,3 1,2,3 3 3 NA
2 10 1,2,3 1,2,3 1,3 3 NA
3 11 1,2 1,2,3 1 NA
4 12 1,2 1,2,3 1 3 NA
5 13 3 1,2 1,2 NA
6 14 2,3 1,2 1,2,3 3 NA
7 15 1,3 1,2 1 NA
8 16 3 1 NA
9 17 2,3 NA
10 18 2 NA
여기서 금요일을 제외한 빈 공간의 시간을 골라내야 합니다.
#금요일 제외
df<-df[,-6]
df <- as.data.frame(apply(df, 2, function(x) ifelse(x == "", NA, x)))
#library('magrittr') : pipe(%>%) 사용
> df %>% colnames()
[1] "X" "월" "화" "수" "목"
X -> time으로 네이밍을 다시 시켜줍니다.
colnames(df)를 전부 다 써준다거나 해도 되지만, 다음 패키지를 불러와서 rename() 함수를 이용하면 지정 컬럼 네임만 변경가능합니다.
library('dplyr')
#rename(.data=df, new_colname = old_colname)
df%<>% rename('time'='X')
행을 기준으로 NA가 하나라도 존재하는 행만 출력하는 함수를 이용해 더 간략하게 보겠습니다.
혹여나 apply계열 함수를 잘 모르시는 분이면 아래 내용을 참고해주세요.
https://pastryofjsmath.tistory.com/43
자주 쓰이는 apply계열 함수 사용법 in r
apply계열 중 자주 쓰이는 3가지만 알아보겠습니다. 1. apply는 단일 벡터형태로는 사용불가능합니다그러니까 'data = df$월'로 apply 적용이 안된다는 것이죠.MarginFUN의 진행방향 [1 : row , 2 : col]FUN사용
pastryofjsmath.tistory.com
df[apply(df,MARGIN = 1,FUN = function(x) any(is.na(x))),]
#결과
X 월 화 수 목
3 11 1,2 1,2,3 1 <NA>
5 13 3 <NA> 1,2 1,2
7 15 1,3 1,2 <NA> 1
8 16 <NA> 3 <NA> 1
9 17 <NA> 2,3 <NA> <NA>
10 18 2 <NA> <NA> <NA>
이제 NA에 대한 네이밍을 해주어야합니다.
예로들어 화요일 13시에 스케쥴이 공통적으로 비어있음을 알 수 있습니다.
이것을 화13 이런식으로 표현하려고 합니다.
#names(df)[is.na(x)] = 모든 행에 대해서(x) -> is.na(df[x,])
#그러니까 is.na(df[1,]), is.na(df[2,]),...
#x['시간'] = df[x,]에서 시간
#cols_na은 is.na(df[1,]), is.na(df[2,]),...의 요일의 데이터이다.
na_info <- apply(df,1,function(x){
cols_na <- names(df)[is.na(x)]
time_value <- x['시간']
sapply(cols_na,function(col) paste0(col, time_value))
})
여기서 중요한 점은 apply가 어떻게 돌아가는지 알아야합니다. 사용이유를 인지하고 있으면 코드짜기가 쉽습니다.
apply에서 function(x)는 margin에 영향을 받습니다. df[x,] , df[,x] 이런식으로 여러개를 반복하기 어려울 때 사용하죠.
na_info %>% unlist()
> na_info %>% unlist()
금 금 목 금 금 화 금 금 수 금 수 금 월 수 목 금
"금 9" "금10" "목11" "금11" "금12" "화13" "금13" "금14" "수15" "금15" "수16" "금16" "월17" "수17" "목17" "금17"
화 수 목 금
"화18" "수18" "목18" "금18"
#list에 name이 붙어있으므로 제거.
empty_schedule <- na_info %>% unlist(,use.names = F)
empty_schedule
#단일 샘플링
empty_schedule[sample(x = 1:length(empty_schedule),size = 1)]
#복수개로 늘릴 준비
empty_vec<-c()
#for문 이용
for (i in 1:100) {
empty_vec <- c(empty_vec,empty_schedule[sample(x = 1:length(empty_schedule),size = 1)])
}
empty_vec %>% table()/length(empty_vec)
> empty_vec %>% table()/length(empty_vec)
.
금 9 금10 금11 금12 금13 금14 금15 금16 금17 금18 목11 목17 목18 수15 수16 수17 월17 화13 화18
0.03 0.06 0.05 0.08 0.05 0.10 0.07 0.07 0.03 0.02 0.05 0.05 0.04 0.06 0.06 0.05 0.05 0.06 0.02
((empty_vec %>% table())/length(empty_vec)) %>% max
> ((empty_vec %>% table())/length(empty_vec)) %>% max
[1] 0.1
스케쥴에서 모두 되는 시간을 추출해서 다른 사람들에게 알렸더니 아직도 못정하고 있네요.
그럼 for문을 돌려 샘플링을 반복해서 빈도 수가 가장 높은 날을 잡는 것으로 합니다.
'금 14'로 약속을 잡으면 되겠죠
'헷갈릴만한 개념' 카테고리의 다른 글
R에서 for문 밖에 함수를 정의하면 생기는 문제 (0) | 2024.08.02 |
---|---|
R에서 for문 안에 함수를 정의하면 생기는 문제 (0) | 2024.08.01 |
단변수 함수 해 구하기(repeat()함수 사용) - in R (1) | 2024.03.26 |
데이터 스케일링 기법(표준화(standardzation),정규화(nomalization)) (0) | 2024.03.20 |