Как создать новую переменную на основе изменений другой переменной в r - PullRequest
0 голосов
/ 29 сентября 2018

Я действительно новичок, но, пожалуйста, помогите мне выполнить это задание.

У меня есть следующий образец набора данных в "polityScore", и мне нужно создать новую переменную с именем "politChange"это основано на ежегодных изменениях первой переменной при следующих условиях:

if polityScore in A in year1 + 1 > polityScore in A in year1---> "democratization"
if polityScore in A in year1 + 1 < polityScore in A in year1---> "autocratization"
if polityScore in A in year1 + 1 = polityScore in A in year1---> "no change"

данные:

country, date, polityScore, politicalChange

A   ,2000   ,5  ,
A   ,2001   ,6  ,
A   ,2002   ,4  ,
A   ,2003   ,5  ,
A   ,2004   ,5  ,
A   ,2005   ,7  ,
B   ,2000   ,5  ,
B   ,2001   ,6  ,
B   ,2002   ,4  ,
B   ,2003   ,5  ,
B   ,2004   ,5  ,
B   ,2005   ,7  ,

Спасибо!

1 Ответ

0 голосов
/ 29 сентября 2018

Вы, вероятно, хотите что-то вроде ниже.Пакет 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, которые могут помочь вам в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...