Выполнение цикла с условием if else, применяемым к подмножествам фрейма данных (или ко всему фрейму данных) - PullRequest
0 голосов
/ 05 июня 2019

У меня следующая проблема: мне нужно запустить каждое подмножество кадра данных, создавая новые записи для переменной роль в зависимости от 2 условий: совпадение имен свидетелей и жителей домохозяйства.

Фрейм данных (df) выглядит следующим образом: у меня есть 10 переменных ( ID , birth_year , фамилия - Name2nd -, роль в домашнем хозяйстве - роль -, домашнее хозяйство - чч -, имя - Имя1st -, имя свидетеля1 - имя1stW1 -, фамилия свидетеля1 - name2ndW1 -, отношение с ИД и отношение с супругом ИД - отношение2 -).

Вся таблица подмножества переменной чч , в которой собраны все идентификаторы в одном домохозяйстве. Последние четыре переменные показывают имя первого свидетеля в браке удостоверения личности, а также их отношение к этому удостоверению - отношение - и к их супругу - отношение2 -. Например, в моем примере ниже, ID 1 Альберт Снейдерс , чей свадебный свидетель Корнелис Мартин . Корнелис Мартин - его брат ( отношение ) и шурин супруга ( отношение 2 ).

Теперь здесь, так как Корнелис Мартин также живет в том же домохозяйстве, что и ID 1, и мы знаем соотношение между ID 1 и 2, мне нужно изменить значение переменной role от NA до «шурина» (другими словами, для значения комбинации двух отношений: отношение - отношение2 ).

ID  birth_year    Name2nd           role        hh    Name1st name2ndW1 name1stW1 relation relation2
1    1877        Snijders    HeadOfHousehold     1     Albert    Marteen   Kornelis  brother brother-in-law
2    1885        Marteen     NA                  1     Kornelis  NA        NA         NA     NA
3    1897        Snijders    NA                  1     Marja     NA        NA         NA     NA
4    1892        Zelstra     NA                  1     Inge      NA        NA         NA     NA
5    1878        Kuipers     HeadOfHousehold     2     Hans      Snijders  Marja      friend friend
6    1870        Marteen     NA                  2     Joris     Marteen   Joris      NA     NA    
7    1897        Wals        NA                  2     Michel    NA        NA         NA     NA
8    1900        Venstra     NA                  2     Joop      NA        NA         NA     NA
9    1900        Lippe       HeadOfHousehold     3     Jaap      NA        NA         NA     NA
10   1905        Flachs      NA                  3     Klaas     Alb       Kuipers    NA     NA
11   1920        Lippe       NA                  3     Mathias   NA        NA         NA     NA
12   1922        Lippe       NA                  3     Waltfried Flachs    Klaas    cousin   cousin     

Вы можете получить таблицу следующим образом:

A <- read.table(header=T, text="ID  birth_year    Name2nd           role             hh    Name1st name2ndW1 name1stW1 relation relation2
                                1    1877        Snijders    HeadOfHousehold          1     Albert    Marteen   Kornelis  brother brother-in-law
                                2    1885        Marteen     NA                       1     Kornelis  NA        NA         NA     NA
                                3    1897        Snijders    NA                       1     Marja     NA        NA         NA     NA
                                4    1892        Zelstra     NA                       1     Inge      NA        NA         NA     NA
                                5    1878        Kuipers     HeadOfHousehold          2     Hans      Snijders  Marja      friend friend
                                6    1870        Marteen     NA                       2     Joris     Marteen   Joris      NA     NA    
                                7    1897        Wals        NA                       2     Michel    NA        NA         NA     NA
                                8    1900        Venstra     NA                       2     Joop      NA        NA         NA     NA
                                9    1900        Lippe       HeadOfHousehold          3     Jaap      NA        NA         NA     NA
                                10   1905        Flachs      NA                       3     Klaas     Kuipers   Alb        NA     NA
                                11   1920        Lippe       NA                       3     Mathias   NA        NA         NA     NA
                                12   1922        Lippe       NA                       3     Waltfried Flachs    Klaas  cousin  cousin  "    
                  , as.is = T)

Оказавшись здесь, у меня есть два вопроса. То, что я пытался сделать, это группировать по домохозяйствам (чч), и если какой-либо член домохозяйства также стал свидетелем брака какого-либо члена домохозяйства, то измените значение его роли (на тех, которые фигурируют в переменных отношения) .

Я думал о ddply:

df <- ddply (df,. (Hh), transform, role = ifelse ((name2ndW1 == Name2nd & name1stW1 == Name1st), вставка (relatie-relatie2), NA)) </p>

Но это не работает. Я не получаю никаких изменений в «роли». Это моя главная забота.

Мой второй вопрос - не столь важный - касается случая, когда я решил не выполнять этот ifelse тест для подмножества (чч), но для всего набора данных. Есть ли какой-либо код, подобный приведенному выше, например

df <- ddply (df,. (), Transform, role = ifelse ((name2ndW1 == Name2nd & name1stW1 == Name1st), вставка (relatie-relatie2), NA)) </p>

без группировки переменных

Мой ожидаемый результат будет:

ID  birth_year    Name2nd           role             hh    Name1st name2ndW1 name1stW1 relation relation2
1    1877        Snijders    HeadOfHousehold          1     Albert    Marteen   Kornelis  brother brother-in-law
2    1885        Marteen     brother-brother-in-law   1     Kornelis  NA        NA         NA     NA
3    1897        Snijders    NA                       1     Marja     NA        NA         NA     NA
4    1892        Zelstra     NA                       1     Inge      NA        NA         NA     NA
5    1878        Kuipers     HeadOfHousehold          2     Hans      Snijders  Marja      friend friend
6    1870        Marteen     NA                       2     Joris     Marteen   Joris      NA     NA    
7    1897        Wals        NA                       2     Michel    NA        NA         NA     NA
8    1900        Venstra     NA                       2     Joop      NA        NA         NA     NA      
9    1900        Lippe       HeadOfHousehold          3     Jaap      NA        NA         NA     NA
10   1905        Flachs      cousin-cousin            3     Klaas     Kuipers   Alb        NA     NA
11   1920        Lippe       NA                       3     Mathias   NA        NA         NA     NA
12   1922        Lippe       NA                       3     Waltfried Flachs    Klaas    cousin  cousin   

Любые советы приветствуются, и большое спасибо за чтение.

1 Ответ

1 голос
/ 05 июня 2019

Вот решение, использующее пакет dplyr вместо plyr. Хитрость заключается в том, чтобы соединить таблицу с ее копией, сопоставив имя человека с именем свидетеля. Чтобы было понятнее, я создал df_witness, который является копией (поднабором) A с переименованными полями

library(dplyr)
df_witness = A %>%
  select(hh, Name1st=name1stW1, Name2nd=name2ndW1, i_rel=relation, i_rel2=relation2) %>% 
  filter(!is.na(Name2nd))

A %>% 
  left_join(
    df_witness, 
    by = c("hh", "Name1st", "Name2nd")
    ) %>% 
  mutate(role = if_else(!is.na(role), role, paste0(i_rel,"-",i_rel2))) %>% 
  select(-i_rel, -i_rel2)

Если вы хотите искать свидетеля во всем наборе данных, а не только в домашнем хозяйстве, вы можете присоединиться к by = c("Name1st", "Name2nd") (и удалить переменную hh из df_witness)

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