조건이 다른 여러 그룹의 데이터 프레임에 새 변수를 추가하고 싶습니다. 내 데이터는 다음과 같습니다.
test <- data.frame(country =rep( letters[1:5], each = 10),
time = seq(from = as.Date('2020-01-01'), to = as.Date('2020-02-19'), by = 'day')) %>% mutate(time = as.Date(time))
lockdown_time <- data.frame(country = letters[1:4],
start_time = c('2020-01-06', '2020-01-16', '2020-01-26', '2020-02-05'),
end_time = c('2020-01-08','2020-01-18','2020-01-28','2020-02-07'))
내가 사용하는 것이 country == 'a'
예를 들어 :
# use country a as an example
test_a <- test %>% filter(country == 'a')
start_time_a <- lockdown_time[1,2] %>% as.Date()
end_time_a <- lockdown_time[1,3] %>% as.Date()
test_a %>% mutate(lockdown = case_when(between(time, start_time_a, end_time_a) ~ 1, T ~ 0))
lockdown
모든 국가에서 새 변수 를 하나씩 추가하는 방법을 알고 있지만이를 수행하는 효율적인 방법이 있는지 궁금합니다. 어떤이 있음을주의 country == 'e'
에서 lockdown_time
생성 된, 그래서 dataframe을 lockdown
에 변수가 country == 'e'
모두 있어야합니다 NA
.
당신은 사용할 수 있습니다 >=
및 <=
날짜가 지정된 범위 내에있는 경우를 식별 할 수 있습니다.
library(dplyr)
test %>%
left_join(lockdown_time, by = "country") %>%
mutate(start_time = as.Date(start_time), end_time = as.Date(end_time),
lockdown = + (time >= start_time & time <= end_time)) %>%
select(-ends_with("_time"))
또는 between()
함께 사용rowwise()
test %>%
left_join(lockdown_time, by = "country") %>%
mutate(start_time = as.Date(start_time), end_time = as.Date(end_time)) %>%
rowwise() %>%
mutate(lockdown = + between(time, start_time, end_time)) %>%
select(-ends_with("_time")) %>%
ungroup()
산출
# A tibble: 50 x 3
country time lockdown
<chr> <date> <int>
1 a 2020-01-01 0
2 a 2020-01-02 0
3 a 2020-01-03 0
4 a 2020-01-04 0
5 a 2020-01-05 0
6 a 2020-01-06 1
7 a 2020-01-07 1
8 a 2020-01-08 1
9 a 2020-01-09 0
10 a 2020-01-10 0
11 b 2020-01-11 0
12 b 2020-01-12 0
13 b 2020-01-13 0
14 b 2020-01-14 0
15 b 2020-01-15 0
16 b 2020-01-16 1
17 b 2020-01-17 1
18 b 2020-01-18 1
19 b 2020-01-19 0
20 b 2020-01-20 0
⠇
46 e 2020-02-15 NA
47 e 2020-02-16 NA
48 e 2020-02-17 NA
49 e 2020-02-18 NA
50 e 2020-02-19 NA
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다