Как я могу назначить фактор в новой переменной на основе того, содержится ли данная строка в другой переменной (R)? - PullRequest
0 голосов
/ 20 февраля 2020

С помощью Европейского социального опроса (ESS) я пытаюсь очистить свои данные в RStudio. Я использовал paste (), чтобы объединить три отдельных столбца, prtvtDK / prtvtNO / prtvtSE (партия, за которую проголосовали на последних выборах, соответственно, Дания / Норвегия / Швеция), в один fullprtvt, который имеет около 38000 отдельных случаев на 8 волнах.

То, что я хочу сделать, это назначить каждому индивидууму фактор «популистский» или «непопулистский» в зависимости от того, за какую партию они проголосовали на последних выборах. При сборе данных названия партий менялись на несколько волн, поэтому для одной и той же партии есть несколько имен, но у меня есть список имен, используемых для популистских партий, которые я перечислю ниже:

  • 'Dansk Folkeparti'
  • 'Dansk Folkeparti - Dani sh народная партия'
  • 'Sverigedemokraterna'
  • 'Партия прогресса (FrP)'
  • «Партия прогресса» (FRP)

По сути, я хочу, чтобы все, кто голосовал за одну из вышеуказанных партий, были отнесены к категории «народников» в новой переменной. Я думал, что какая-то функция ifelse () или оператор if может сработать, но читая другие посты, я видел людей, предлагающих вместо этого использовать функцию switch (). Как лучше всего решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020

Вы можете использовать grep для идентификации общих строк в партиях, помеченных популистами.

Здесь я предполагаю, что ваш фрейм данных называется df, а fullprtvt является столбцом в этих данных. Рамка. Вам нужно убедиться, что это столбец символов. Если нет, вы можете изменить df$fullprtvt на as.character(df$fullprtvt) следующим образом:

pop <- grep('Dansk Folkeparti|Sverigedemokraterna|Progress Party', df$fullprtvt)
df$pop_nonpop <- rep("Non-populist", nrow(df))
df$pop_nonpop[pop] <- "Populist"

Вот воспроизводимый пример некоторых фиктивных данных:

set.seed(69)
df <- data.frame(fullprtvt = sample(c('Dansk Folkeparti',
                                      'Dansk Folkeparti - Danish peoples party',
                                      'Sverigedemokraterna',
                                      'Progress Party (FrP)',
                                      'Progress Party (FRP)',
                                      'Moderate party',
                                      'Communist',
                                      'Socialist',
                                      'Democrat'), 10, TRUE))

df
#>                                  fullprtvt
#> 1                         Dansk Folkeparti
#> 2  Dansk Folkeparti - Danish peoples party
#> 3                                Socialist
#> 4                                Communist
#> 5                                Communist
#> 6                           Moderate party
#> 7                                Communist
#> 8  Dansk Folkeparti - Danish peoples party
#> 9                     Progress Party (FrP)
#> 10 Dansk Folkeparti - Danish peoples party

И как приведенный выше код будет работа:

pop <- grep('Dansk Folkeparti|Sverigedemokraterna|Progress Party', df$fullprtvt)
df$pop_nonpop <- rep("Non-populist", nrow(df))
df$pop_nonpop[pop] <- "Populist"

df
#>                                  fullprtvt   pop_nonpop
#> 1                         Dansk Folkeparti     Populist
#> 2  Dansk Folkeparti - Danish peoples party     Populist
#> 3                                Socialist Non-populist
#> 4                                Communist Non-populist
#> 5                                Communist Non-populist
#> 6                           Moderate party Non-populist
#> 7                                Communist Non-populist
#> 8  Dansk Folkeparti - Danish peoples party     Populist
#> 9                     Progress Party (FrP)     Populist
#> 10 Dansk Folkeparti - Danish peoples party     Populist

Создано в 2020-02-20 пакетом Представить (v0.3.0)

1 голос
/ 20 февраля 2020

Если у вас есть список, вы можете использовать синтаксис dplyr :: case_when:

library(dplyr)

df <- data.frame(fullprtvt = sample(c('Dansk Folkeparti',
                                      'Dansk Folkeparti - Danish peoples party',
                                      'Sverigedemokraterna',
                                      'Progress Party (FrP)',
                                      'Progress Party (FRP)',
                                      'Moderate party',
                                      'Communist',
                                      'Socialist',
                                      'Democrat'), 10, TRUE))

left<-c(
  'Sverigedemokraterna',
  'Progress Party (FrP)',
  'Progress Party (FRP)', 
  'Moderate party',
  'Communist',
  'Socialist')
right<-c(
  'Dansk Folkeparti',
  'Dansk Folkeparti - Danish peoples party')


df %>%
  mutate(fullprtvt=as.character(fullprtvt)) %>% 
  mutate(affiliation =
           case_when(
             fullprtvt %in% left ~ "left",
             fullprtvt %in% right ~ "right",
             TRUE ~ fullprtvt
           ))

Это приведет к:

                                 fullprtvt affiliation
1                         Dansk Folkeparti       right
2                         Dansk Folkeparti       right
3                                Socialist        left
4  Dansk Folkeparti - Danish peoples party       right
5                     Progress Party (FrP)        left
6                     Progress Party (FrP)        left
7                     Progress Party (FrP)        left
8                           Moderate party        left
9                      Sverigedemokraterna        left
10 Dansk Folkeparti - Danish peoples party       right

Это может быть расширено для строк в именах сторон:

# строк

    left   <- Hmisc::Cs(progres, commun,  soc)
    centre <- Hmisc::Cs(moderat, demo)
    right  <- Hmisc::Cs(people, folk)

regexStr <- paste0(c(left,centre, right), collapse = "|")

df %>%
  mutate(fullprtvt = 
           as.character(fullprtvt) )%>% 
  mutate(shortprtvt= 
           str_extract(
             string = str_to_lower( fullprtvt), 
             pattern = regexStr)) %>% 
  mutate(affiliation =
           case_when(
             shortprtvt %in%   left ~ "left",
             shortprtvt %in% centre ~ "centre",
             shortprtvt %in%  right ~ "right",
                               TRUE ~  fullprtvt
           ))

Мы получаем результат (обратите внимание, что regex и case_when могут быть изменены далее, чтобы обнаружить, если два слова, из которых одно сигнализирует о выходе, другие сигналы, скажем, аграрник, на самом деле не должен означать не левый, а центр или правый ....)

                                 fullprtvt shortprtvt affiliation
1  Dansk Folkeparti - Danish peoples party       folk       right
2                                 Democrat       demo      centre
3                     Progress Party (FRP)    progres        left
4                     Progress Party (FRP)    progres        left
5                                Socialist        soc        left
6                                 Democrat       demo      centre
7                     Progress Party (FRP)    progres        left
8                         Dansk Folkeparti       folk       right
9                      Sverigedemokraterna       demo      centre
10                     Sverigedemokraterna       demo      centre
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...