我有以下问题:我需要运行数据框的每个子集,并根据以下两个条件为变量角色创建新条目:证人和住户人名之间的匹配。>
数据帧(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
欢迎任何提示,非常感谢您阅读。
答案 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
)