【发布时间】:2018-05-16 19:51:42
【问题描述】:
我有一个数据框df,其中包含近 100,000 个显示我的程序联系人列表的数据。该列表有一列显示与联系人关联的程序program 和组织OrgName。它还有一组三列,显示联系人是否与列名称中标识的角色相关联:Role_Primary、Role_Comms、Role_Signatory。每当联系人在多个程序中或在程序中具有多个角色时,都会为该联系人创建另一行,并且联系人角色字段值会发生变化。请参阅下面的示例。
First Last C_ID OrgName O_ID Program Role_Primary Role_Comms Role_Signatory
John Smith 10045 Acme 901 Buildings X
John Smith 10045 Acme 901 Buildings X
John Smith 10045 Acme 901 Homes X
Teddy Bush 10046 Acme 901 Buildings X
Teddy Bush 10046 Acme 901 Buildings X
Jess Clinton 10050 Consult 904 Homes X
Jess Clinton 10050 Consult 904 Homes X
Jess Clinton 10050 Consult 904 Homes X
出于演示目的,我试图尽量减少行数。具体来说,如果一个联系人在同一个组织和同一个程序中,我只希望该联系人出现在一行上(而不是目前的几行),并在相关列中注明联系人角色。见下文。
First Last C_ID OrgName O_ID Program Role_Primary Role_Comms Role_Signatory
John Smith 10045 Acme 901 Buildings X X
John Smith 10045 Acme 901 Homes X
Teddy Bush 10046 Acme 901 Buildings X X
Jess Clinton 10050 Consult 904 Homes X X X
重新创建上面的两个表:
table1<-structure(list(First = structure(c(2L, 2L, 2L, 3L, 3L, 1L, 1L,
1L), .Label = c("Jess", "John", "Teddy"), class = "factor"),
Last = structure(c(3L, 3L, 3L, 1L, 1L, 2L, 2L, 2L), .Label = c("Bush",
"Clinton", "Smith"), class = "factor"), C_ID = c(10045L,
10045L, 10045L, 10046L, 10046L, 10050L, 10050L, 10050L),
OrgName = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("Acme",
"Consult"), class = "factor"), O_ID = c(901L, 901L, 901L,
901L, 901L, 904L, 904L, 904L), Program = structure(c(1L,
1L, 2L, 1L, 1L, 2L, 2L, 2L), .Label = c("Buildings", "Homes"
), class = "factor"), Role_Primary = structure(c(2L, 1L,
2L, 2L, 1L, 1L, 2L, 1L), .Label = c("", "X"), class = "factor"),
Role_Comms = structure(c(1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L), .Label = c("",
"X"), class = "factor"), Role_Signatory = structure(c(1L,
1L, 1L, 1L, 2L, 2L, 1L, 1L), .Label = c("", "X"), class = "factor")), .Names = c("First",
"Last", "C_ID", "OrgName", "O_ID", "Program", "Role_Primary",
"Role_Comms", "Role_Signatory"), class = "data.frame", row.names = c(NA,
-8L))
table2<-structure(list(First = structure(c(2L, 2L, 3L, 1L), .Label = c("Jess",
"John", "Teddy"), class = "factor"), Last = structure(c(3L, 3L,
1L, 2L), .Label = c("Bush", "Clinton", "Smith"), class = "factor"),
C_ID = c(10045L, 10045L, 10046L, 10050L), OrgName = structure(c(1L,
1L, 1L, 2L), .Label = c("Acme", "Consult"), class = "factor"),
O_ID = c(901L, 901L, 901L, 904L), Program = structure(c(1L,
2L, 1L, 2L), .Label = c("Buildings", "Homes"), class = "factor"),
Role_Primary = structure(c(1L, 1L, 1L, 1L), .Label = "X", class = "factor"),
Role_Comms = structure(c(2L, 1L, 1L, 2L), .Label = c("",
"X"), class = "factor"), Role_Signatory = structure(c(1L,
1L, 2L, 2L), .Label = c("", "X"), class = "factor")), .Names = c("First",
"Last", "C_ID", "OrgName", "O_ID", "Program", "Role_Primary",
"Role_Comms", "Role_Signatory"), class = "data.frame", row.names = c(NA,
-4L))
【问题讨论】:
-
你知道如何使用dplyr吗?如果是这样,只需将所有
role变量转换为整数标志(而不是“x”),然后按非role变量分组并使用 summarise() 创建新的role变量,就很容易了.如果你dput()你的数据样本,我可以为你做。 -
克里斯 我不熟悉如何使用 dplyr 来做到这一点。我在原始问题中添加了 dput 数据。谢谢。
-
看起来有人已经回答了。我认为这将回答对你有用。如果没有,请告诉我