Вы, вероятно, хотите что-то вроде ниже.Пакет dplyr может помочь с этим.Первая группа по стране, так что следующее заявление if_else
делается для каждой страны.В if_else сравнивает polityScore с polityScore за 1 год до этого и на основании этого заполняет слова «демократизация», «автократизация» или «без изменений».Первым значением группы будет NA.
Если вам не нужны NA, а вместо этого «без изменений», добавьте default = first(polityScore)
к функции задержки.
library(dplyr)
df1 %>%
group_by(country) %>%
mutate(politicalChange = if_else(polityScore > lag(polityScore), "democratization",
ifelse(polityScore < lag(polityScore), "autocratization", "no change")))
# A tibble: 12 x 4
# Groups: country [2]
country date polityScore politicalChange
<chr> <dbl> <dbl> <chr>
1 A 2000 5 NA
2 A 2001 6 democratization
3 A 2002 4 autocratization
4 A 2003 5 democratization
5 A 2004 5 no change
6 A 2005 7 democratization
7 B 2000 5 NA
8 B 2001 6 democratization
9 B 2002 4 autocratization
10 B 2003 5 democratization
11 B 2004 5 no change
12 B 2005 7 democratization
Дляудобочитаемость ваших правил вы также можете использовать case_when
вместо if_else
.case_when
также заполняет NA с правилом TRUE.
df1 %>%
group_by(country) %>%
mutate(politicalChange = case_when(polityScore > lag(polityScore) ~ "democratization",
polityScore < lag(polityScore) ~ "autocratization",
TRUE ~ "no change"))
# A tibble: 12 x 4
# Groups: country [2]
country date polityScore politicalChange
<chr> <dbl> <dbl> <chr>
1 A 2000 5 no change
2 A 2001 6 democratization
3 A 2002 4 autocratization
.....
data:
df1 <- structure(list(country = c("A", "A", "A", "A", "A", "A", "B",
"B", "B", "B", "B", "B"), date = c(2000, 2001, 2002, 2003, 2004,
2005, 2000, 2001, 2002, 2003, 2004, 2005), polityScore = c(5,
6, 4, 5, 5, 7, 5, 6, 4, 5, 5, 7), politicalChange = c(NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -12L
), class = "data.frame")
PS
check bookdown.org для множества книг по R, которые могут помочь вам в дальнейшем.