运行循环,将if else条件应用于数据帧(或整个数据帧)的子集

时间:2019-06-05 15:53:30

标签: r

我有以下问题:我需要运行数据框的每个子集,并根据以下两个条件为变量角色创建新条目:证人和住户人名之间的匹配。

数据帧(df)如下:我有10个变量( ID 出生年份,姓氏– Name2nd -,家庭-角色-,家庭- hh -,名字– Name1st -,见证人1的名字- name1stW1 -,见证人1的姓氏- name2ndW1 -,具有ID的关系和与ID的配偶的关系– relation2 -)。

整个表由 hh 变量子集,收集同一家庭下的所有ID。最后四个变量显示ID婚姻中第一个证人的姓名,以及与该ID的关系- relation -及其与配偶的关系- relation2 - 。例如,在下面的示例中,ID 1是 Albert Snijders ,其婚礼见证人是 Kornelis Marteen Kornelis Marteen 是他的兄弟( relation )和配偶的brother子( relation2 )。

现在,由于 Kornelis Marteen 也与ID 1居住在同一家庭,我们知道ID 1和2之间的关系,因此我需要更改变量 role的值(从NA到“法律上的兄弟”)(换句话说,是两个关系的组合的值: relation - relation2 )。 / 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     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)

在这里,我有两个问题。我试图做的是按家庭分组(hh),如果该家庭中的任何一个碰巧也是任何家庭成员婚姻的见证人,则修改其角色的价值(针对关系变量中出现的角色)

我想到了ddply:

df <-ddply(df,。(hh),transform,role = ifelse((name2ndW1 == Name2nd&name1stW1 == Name1st),paste(relatie-relatie2),NA))

但这不起作用。我的“角色”没有任何变化。这是我主要的担心。

我的第二个问题-不是那么重要-是因为我决定不对每个子集(hh)进行此 ifelse 测试,而是针对整个数据集。是否有与上述类似的代码

df <-ddply(df,。(),transform,role = ifelse((name2ndW1 == Name2nd&name1stW1 == Name1st),paste(relatie-relatie2),NA))

没有分组变量

我的预期结果是:

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 个答案:

答案 0 :(得分:1)

这是一个解决方案,使用软件包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