2017-02-22 16 views
0

Мне нужно заполнить столбец Cross Affiliation на основе столбцов Address and Political Party. Логика заключается в том, что по тому же адресу, если там проживают несколько человек, и у любого из них есть другая политическая партия, чем любое другое лицо в этом адресе, то перекрестная принадлежность для всех лиц по этому адресу должна быть «y», в противном случае «n» ».Добавление столбца на основе других 2 столбцов и путем сравнения значений внутри группы

Name Address    Political party Cross Affiliation 
Jane 10 W STATE ST ALBION  D    n 
David 10 W STATE ST ALBION  D    n 
Kate 105 W STATE ST ALBION  R    n 
Tom  40 DEER ST ALBION   D    y 
Lee  40 DEER ST ALBION   D    y 
Ann  40 DEER ST ALBION   R    y 

Я рисую пробел о том, как действовать. Любой совет?

ответ

1

Вы можете достичь этого в базе R с ave:

df$cross <- ave(df$Political_party, df$Address, FUN=function(i) length(unique(i)) > 1) 

Это добавит логический вектор к вашему data.frame где это ИСТИНА, если есть более чем одна партия, представленная в домашнем хозяйстве. Я бы рекомендовал работать с логическими векторами, а не с буквами, так как R будет относиться к ним естественным образом. Это возвращает

df 
    Name Address Political_party cross 
1 Jane  10    D FALSE 
2 David  10    D FALSE 
3 Kate  105    R FALSE 
4 Tom  40    D TRUE 
5 Lee  40    D TRUE 
6 Ann  40    R TRUE 

мне пришлось внести незначительные изменения в данных, чтобы читать его, которые не вредят целостности результата.

данные

df <- 
structure(list(Name = c("Jane", "David", "Kate", "Tom", "Lee", 
"Ann"), Address = c(10L, 10L, 105L, 40L, 40L, 40L), Political_party = c("D", 
"D", "R", "D", "D", "R")), .Names = c("Name", "Address", "Political_party" 
), row.names = c(NA, -6L), class = "data.frame") 

Этот код будет работать более 2-х сторон. Рассмотрим, например, следующие data.frame.

set.seed(1234) 
df2 <- rbind(df, within(df, {Political_party <- sample(LETTERS[1:3], nrow(df), replace=TRUE) 
          Address <- Address + 1L})) 

Здесь я удвоил количество домашних хозяйств и добавил больше вечеринок. Новый data.frame приведен ниже.

df2 
    Name Address Political_party 
1 Jane  10    D 
2 David  10    D 
3 Kate  105    R 
4 Tom  40    D 
5 Lee  40    D 
6 Ann  40    R 
7 Jane  11    A 
8 David  11    B 
9 Kate  106    B 
10 Tom  41    B 
11 Lee  41    C 
12 Ann  41    B 

Теперь, используя код,

df2$cross <- ave(df2$Political_party, df2$Address, FUN=function(i) length(unique(i)) > 1) 

мы получаем

df2 
    Name Address Political_party cross 
1 Jane  10    D FALSE 
2 David  10    D FALSE 
3 Kate  105    R FALSE 
4 Tom  40    D TRUE 
5 Lee  40    D TRUE 
6 Ann  40    R TRUE 
7 Jane  11    A TRUE 
8 David  11    B TRUE 
9 Kate  106    B FALSE 
10 Tom  41    B TRUE 
11 Lee  41    C TRUE 
12 Ann  41    B TRUE 

Обратите внимание, что в новых наблюдениях, только одноточечно семья не имеет перекрестную сторону. Также обратите внимание, что значения в предыдущем кадре data.frame не затрагиваются.

+0

Спасибо. Я использовал код, но он не работал. он дал результат как AC 0, AD 0, AE 0, D 8907 и т. д. AC, AD, AE являются другими уровнями в Polit_Party, и существует около 30 различных уровней, тогда как R и D являются самыми большими двумя уровнями. Интересно, потому что в политической партии есть более двух уровней? –

+0

Я не уверен, что вы имеете в виду. Вы задаете вопрос о двоичной переменной, и вы сообщаете целочисленные значения в комментарии. Если это подсчеты домашних хозяйств с межпартийной принадлежностью, то возможно, что в ваших данных нет ни одного. – lmo

+0

жаль, что я сделал это запутанным. Я думаю, ваше замечание объясняет, почему это не сработало. Политическая партия не является двоичной переменной, а имеет 30 разных уровней. Можете ли вы посоветовать, как изменить синтаксис? Благодарю. –

1

Использование dplyr

df <- df %>% 
    group_by(Address) %>% 
    mutate(Cross_Affiliation = ifelse(n_distinct(Political_party)==1,'n','y')) 
df 
#Source: local data frame [6 x 4] 
#Groups: Address [3] 
# Name    Address Political_party Cross_Affiliation 
# <chr>     <chr>   <chr>    <chr> 
#1 Jane 10 W STATE ST ALBION    D     n 
#2 David 10 W STATE ST ALBION    D     n 
#3 Kate 105 W STATE ST ALBION    R     n 
#4 Tom 40 DEER ST ALBION    D     y 
#5 Lee 40 DEER ST ALBION    D     y 
#6 Ann 40 DEER ST ALBION    R     y