我有两个 data.frames——一个查找表,它告诉我一组中包含的一组产品。每组有at least类型 1 和类型 2 的一种产品。
第二个 data.frame 告诉我有关交易的详细信息。每笔交易可以有以下产品之一:
a) 唯一的产品s来自其中一组的 1 型
b) 唯一产品s来自其中一组的 2 型
c) 类型1和类型2的产品来自同一组
对于我的分析,我有兴趣找出上面的 c),即有多少交易拥有类型 1 的产品and类型 2(来自同一组) 卖。如果来自不同组的类型 1 产品和类型 2 产品在同一交易中出售,我们将完全忽略该交易。
因此,类型 1 或类型 2 的每个产品必须属于同一组。
这是我的查找表:
> P_Lookup
Group ProductID1 ProductID2
Group1 A 1
Group1 B 2
Group1 B 3
Group2 C 4
Group2 C 5
Group2 C 6
Group3 D 7
Group3 C 8
Group3 C 9
Group4 E 10
Group4 F 11
Group4 G 12
Group5 H 13
Group5 H 14
Group5 H 15
例如,我不会在一笔交易中拥有产品 G 和产品 15,因为它们属于不同的组。
以下是交易情况:
TransactionID ProductID ProductType
a1 A 1
a1 B 1
a1 1 2
a2 C 1
a2 4 2
a2 5 2
a3 D 1
a3 C 1
a3 7 2
a3 8 2
a4 H 1
a5 1 2
a5 2 2
a5 3 2
a5 3 2
a5 1 2
a6 H 1
a6 15 2
My Code:
现在,我可以使用编写代码dplyr
用于从一组中筛选交易。但是,我不确定如何矢量化我的代码all groups.
这是我的代码:
P_Groups<-unique(P_Lookup$Group)
Chosen_Group<-P_Groups[5]
P_Group_Ind <- P_Trans %>%
group_by(TransactionID)%>%
dplyr::filter((ProductID %in% unique(P_Lookup[P_Lookup$Group==Chosen_Group,]$ProductID1)) |
(ProductID %in% unique(P_Lookup[P_Lookup$Group==Chosen_Group,]$ProductID2)) ) %>%
mutate(No_of_PIDs = n_distinct(ProductType)) %>%
mutate(Group_Name = Chosen_Group)
P_Group_Ind<-P_Group_Ind[P_Group_Ind$No_of_PIDs>1,]
只要我手动选择每个组(即通过设置),这就可以很好地工作Chosen_Group
。但是,我不确定如何自动化此操作。我想的一种方法是使用for循环,但我知道R的美妙之处在于向量化,所以我想远离使用for循环。
我真诚地感谢任何帮助。我在这上面花了将近两天的时间。我在看在r中的for循环中使用dplyr https://stackoverflow.com/questions/33611657/using-dplyr-in-for-loop-in-r,但该线程似乎正在讨论不同的问题。
DATA:
Here's dput
for P_Trans
:
structure(list(TransactionID = c("a1", "a1", "a1", "a2", "a2",
"a2", "a3", "a3", "a3", "a3", "a4", "a5", "a5", "a5", "a5", "a5",
"a6", "a6"), ProductID = c("A", "B", "1", "C", "4", "5", "D",
"C", "7", "8", "H", "1", "2", "3", "3", "1", "H", "15"), ProductType = c(1,
1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2)), .Names = c("TransactionID",
"ProductID", "ProductType"), row.names = c(NA, 18L), class = "data.frame")
Here's dput
for P_Lookup
:
structure(list(Group = c("Group1", "Group1", "Group1", "Group2",
"Group2", "Group2", "Group3", "Group3", "Group3", "Group4", "Group4",
"Group4", "Group5", "Group5", "Group5"), ProductID1 = c("A",
"B", "B", "C", "C", "C", "D", "C", "C", "E", "F", "G", "H", "H",
"H"), ProductID2 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 15)), .Names = c("Group", "ProductID1", "ProductID2"), row.names = c(NA,
15L), class = "data.frame")
这是dput()
将查找表中不存在的产品添加到 P_Trans 后:
structure(list(TransactionID = c("a1", "a1", "a1", "a2", "a2",
"a2", "a3", "a3", "a3", "a3", "a4", "a5", "a5", "a5", "a5", "a5",
"a6", "a6", "a7"), ProductID = c("A", "B", "1", "C", "4", "5",
"D", "C", "7", "8", "H", "1", "2", "3", "3", "1", "H", "15",
"22"), ProductType = c(1, 1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 2, 2,
2, 2, 2, 1, 2, 3)), .Names = c("TransactionID", "ProductID",
"ProductType"), row.names = c(NA, 19L), class = "data.frame")