2017-01-14 7 views
1

Я пытаюсь выяснить, как создать новый столбец в R, который учитывает, остается ли политик «i» в той же партии или дефекта для данных законодательных органов "l". Эти политики и партии признаются из-за индексов. Вот пример того, как мои данные первоначально выглядит следующим образом:Q-Как заполнить новый столбец в data.frame на основе значений строк двумя условиями в R

## example of data 

names <- c("Jesus Martinez", "Anrita blabla", "Paco Pico", "Reiner Steingress", "Jesus Martinez Porras") 
Parti.affiliation <- c("Winner","Winner","Winner", "Loser", NA)#NA, "New party", "Loser", "Winner", NA 
Legislature <- c(rep(1, 5), rep(2,5), rep(3,5), rep(4,5), rep(5,5), rep(6,5)) 
selection <- c(rep("majority", 15), rep("PR", 15)) 
sex<- c("Male", "Female", "Male", "Female", "Male") 
Election<- c(rep(1955, 5), rep(1960, 5), rep(1965, 5), rep(1970,5), rep(1975,5), rep(1980,5)) 

d<- data.frame(names =factor(rep(names, 6)), party.affiliation = c(rep(Parti.affiliation,5), NA, "New party", "Loser", "Winner", NA), legislature = Legislature, selection = selection, gender =rep(sex, 6), Election.date = Election) 

## genrating id for politician and party.affiliation 

d$id_pers<- paste(d$names, sep="") 
d <- arrange(d, id_pers) 
d <- transform(d, id_pers = as.numeric(factor(id_pers))) 
d$party.affiliation1<- as.numeric(d$party.affiliation) 

Ожидаемый результат должен показать следующее: если политик (показал через колонку «id_pers») изменил свои значения в столбце «party.affiliation1 », значение 1 будет присвоено в новом столбце под названием„переключатель“, в противном случае 0. То же процедура должна быть выполнена с каждым политиком в наборе данных, поэтому ожидаемый результат должен быть такой:

d["switch"]<- c(1, rep(0,4), NA, rep(0,6), rep(NA, 6),1, rep(0,5), rep (0,5),1) # 0= remains in the same party/1= switch party affiliation. 

As Например, вы можете видеть в этом data.frame, что первый политик, получивший название «Anrita blabla», был кандидатом от партии «3» от 1-го до 5-го законодательного органа. Однако мы можем заметить, что «Антрита» меняет свою партийную принадлежность в 6-м законодательном органе, поэтому она была кандидатом на партию «2». Поэтому новый столбец «switch» должен содержать значение «1», чтобы отразить изменение Анриты в партийной принадлежности и «0», чтобы показать, что «Anrita» не изменила свою партийную принадлежность для первых 5 законодательных органов.

Я пробовал несколько подходов, чтобы сделать это (например, петли). Я нашел эту стратегию простейший, но он не работает :(

## add a new column based on raw values 
    ind <- c(FALSE, party.affiliation1[-1L]!= party.affiliation1[-length(party.affiliation1)] & party.affiliation1!= 'Null') 
    d <- d %>% group_by(id_pers) %>% mutate(this = ifelse(ind, 1, 0)) 

Я надеюсь, что вы нашли это объяснение ясно, спасибо заранее !!!

ответ

1

Я думаю, что вы могли бы сделать:.

library(tidyverse) 
d%>% 
    group_by(id_pers)%>% 
    mutate(switch=as.numeric((party.affiliation1-lag(party.affiliation1)!=0))) 

Первая запись будет NA, как у нас нет информации о том, их предыдущий, если таковые имеются, партийная принадлежность была другой

Edit:. Мы используем параметр default=lag() с ifelse(), вложенным для дифференциации первых значений.

df=d%>% 
    group_by(id_pers)%>% 
    mutate(switch=ifelse((party.affiliation1-lag(party.affiliation1,default=-99))>90,99,ifelse(party.affiliation1-lag(party.affiliation1)!=0,1,0))) 
+0

Спасибо Jaime Caffarel и @Haboryme. Тем не менее позвольте мне спросить, возможно ли в вашей строке кода сказать R: «присвойте значение 99 этим первым элементам». Таким образом, я могу различать те реальные недостающие ценности и те случаи, которые у меня есть информация об их партийной принадлежности. =) –

+0

Да, см. Мое редактирование. – Haboryme

+0

Спасибо !!!Я люблю ваш ответ, короткий и сладкий :) –

1

Другой подход, использующий data.table:

library(data.table) 

# Convert to data.table 
d <- as.data.table(d) 

# Order by election date 
d <- d[order(Election.date)] 

# Get the previous affiliation, for each id_pers 
d[, previous_party_affiliation := shift(party.affiliation), by = id_pers] 

# If the current affiliation is different from the previous one, set to 1 
d[, switch := ifelse(party.affiliation != previous_party_affiliation, 1, 0)] 

# Remove the column 
d[, previous_party_affiliation := NULL] 

Как Haboryme уже отмечалось, первый вход каждого человека будет NA, из-за отсутствия информации о предыдущих выборах. И результат дал бы это:

    names party.affiliation legislature selection gender Election.date id_pers party.affiliation1 switch 
1:   Anrita blabla   Winner   1 majority Female   1955  1     NA  NA 
2:   Anrita blabla   Winner   2 majority Female   1960  1     NA  0 
3:   Anrita blabla   Winner   3 majority Female   1965  1     NA  0 
4:   Anrita blabla   Winner   4  PR Female   1970  1     NA  0 
5:   Anrita blabla   Winner   5  PR Female   1975  1     NA  0 
6:   Anrita blabla   New party   6  PR Female   1980  1     NA  1 

(...)

EDITED

Для того, чтобы определить первую запись о политической принадлежности и присвоить значение 99 для них, вы можете использовать эта модифицированная версия:

# Note the "fill" parameter passed to the function shift 
d[, previous_party_affiliation := shift(party.affiliation, fill = "First"), by = id_pers] 

# Set 99 to the first occurrence 
d[, switch := ifelse(party.affiliation != previous_party_affiliation, ifelse(previous_party_affiliation == "First", 99, 1), 0)] 
+0

Спасибо большое @JaimeCaffarel !! Тем не менее, можете ли вы найти ответ на мой вопрос в комментарии ниже ответа Хаборима? –

+0

@Adriandelriorodriguez Я обновил ответ –

+1

спасибо большое !!! Я не знал пакет data.table, поэтому я многому научился с вашим сообщением. Тем не менее, я буду использовать другой вариант, потому что я больше знаком с dplyr gramar :) Я учту его пакет data.table в будущее. Еще раз большое спасибо за ваши усилия! –

 Смежные вопросы

  • Нет связанных вопросов^_^