R中的简单数据操作

R中的简单数据操作,r,vectorization,data-manipulation,R,Vectorization,Data Manipulation,@Aniko指出,查看我的问题的一种方法是,我需要找到图的连接组件,其中顶点称为组,变量group和submitted\u group表示这两个组之间的边。我的目标是创建一个变量parent\u Group,它对连接的组件进行索引。或者正如我之前所说: 我有一个包含四个变量的数据框:ID、group、和namified\u ID、和namified\u group 考虑姐妹组:如果数据中至少有一种情况是组==A和组==B,则组A和B是姐妹组,反之亦然 我想创建一个变量parent\u group

@Aniko指出,查看我的问题的一种方法是,我需要找到图的连接组件,其中顶点称为组,变量
group
submitted\u group
表示这两个组之间的边。我的目标是创建一个变量
parent\u Group
,它对连接的组件进行索引。或者正如我之前所说:

我有一个包含四个变量的数据框:
ID
group
、和
namified\u ID
、和
namified\u group

考虑姐妹组:如果数据中至少有一种情况是组==A和组==B,则组A和B是姐妹组,反之亦然

我想创建一个变量
parent\u group
,它为每组姐妹组提供一个唯一的值。换句话说,不同
家长组的案例之间不应出现提名。将
父组
按顺序编号似乎是个好主意

非常感谢我已经得到的帮助!我不能在这里做出贡献,但请注意,我试图在stats.exchange和维基百科上进行转发

在我的假数据中,A和B是姐妹组。情况ID=4或ID=5足以实现这一点。每个团体也是他们自己的姐妹团体。目标是创建
家长组
,对于A组或B组的所有病例,应产生一个
家长组
,对于C组,应产生另一个
家长组

df <- data.frame(ID = c(9, 5, 2, 4, 3, 7), 
  group = c("A", "A", "B", "B", "A", "C"),
  nominated_ID = c(9, 8, 4, 9, 2, 7)     )

df$nominated_group <- with(df, group[match(nominated_ID, ID)])

df

  ID group nominated_ID nominated_group
1  9     A            9               A
2  5     A            8            <NA>
3  2     B            4               B
4  4     B            9               A
5  3     A            2               B
6  7     C            7               C

df考虑一个图,其顶点为组,边表示两个组出现在同一ID中。然后我认为您正在寻找该图的连接组件。以下是使用
graph
软件包快速而肮脏(可能不是最佳)地实现此想法:

library(graph)
#make some fake data
nom <- data.frame(group = c("A","A","A","B","B","C","C"),
                  group2 = c("A","A","B","B","A","C","C"),
            stringsAsFactors=FALSE)
#remove duplicated pairs
#it will keep A-B distinct from B-A, could probably be fixed
nom1 <- nom[!duplicated(nom),]

#define empty graph
grps <- union(unique(nom$group), unique(nom$group2))
gg <- new("graphNEL", nodes=grps, edgeL=list())
#add an edge for every pair
for (i in 1:nrow(nom1)) gg <- addEdge(nom1$group[i], nom1$group2[i], gg, 1)

#find connected components
cc <- connComp(gg)

#assing parent by matching within cc
nom$parent <- apply(nom, 1, 
    function(x) which(sapply(cc, function(y) x["group"] %in% y)))
nom

  group group2 parent
1     A      A      1
2     A      A      1
3     A      B      1
4     B      B      1
5     B      A      1
6     C      C      2
7     C      C      2
库(图形)
#伪造数据

nom考虑一个图,它的顶点是组,边表示两个组出现在同一个ID上。然后我认为您正在寻找这个图的连接组件。以下是使用
graph
软件包快速而肮脏(可能不是最佳)地实现此想法:

library(graph)
#make some fake data
nom <- data.frame(group = c("A","A","A","B","B","C","C"),
                  group2 = c("A","A","B","B","A","C","C"),
            stringsAsFactors=FALSE)
#remove duplicated pairs
#it will keep A-B distinct from B-A, could probably be fixed
nom1 <- nom[!duplicated(nom),]

#define empty graph
grps <- union(unique(nom$group), unique(nom$group2))
gg <- new("graphNEL", nodes=grps, edgeL=list())
#add an edge for every pair
for (i in 1:nrow(nom1)) gg <- addEdge(nom1$group[i], nom1$group2[i], gg, 1)

#find connected components
cc <- connComp(gg)

#assing parent by matching within cc
nom$parent <- apply(nom, 1, 
    function(x) which(sapply(cc, function(y) x["group"] %in% y)))
nom

  group group2 parent
1     A      A      1
2     A      A      1
3     A      B      1
4     B      B      1
5     B      A      1
6     C      C      2
7     C      C      2
库(图形)
#伪造数据

我不明白姐妹组是如何定义的。也许你可以给出一个基于虚假数据的例子?很抱歉,不清楚,为了清楚起见,我将编辑原始数据:如果数据中有一个单独的情况,即A组和B组==A和B组==B,则A组和B组是姐妹组,反之亦然。在我的假数据中,A和B确实是姐妹组。情况ID=4或ID=5足以实现这一点。每个小组也有自己的姐妹小组。目标是创建parent_group,应为A或B中的所有案例创建一个parent_group,为C组创建另一个parent_group。谢谢!对不起,我还是不明白。假设您有一个“D”组。假设ID 8属于该组。身份证8票,身份证7票。那么所有的团体都是姐妹吗?@Iselzer是的!为了提供更多的背景,每个人都有一份他们可以提名的其他人的名单(他们的父母团队)。如果有人在你的家长组中,那么你也在他们的家长组中。但我不知道你在哪个家长组,这就是我想知道的。我所知道的是,一个家长小组由整个小组组成,最多三个。我知道每个人属于哪一组,以及他们提名的是哪一组。我不明白姐妹组是如何定义的。也许你可以给出一个基于虚假数据的例子?很抱歉,不清楚,为了清楚起见,我将编辑原始数据:如果数据中有一个单独的情况,即A组和B组==A和B组==B,则A组和B组是姐妹组,反之亦然。在我的假数据中,A和B确实是姐妹组。情况ID=4或ID=5足以实现这一点。每个小组也有自己的姐妹小组。目标是创建parent_group,应为A或B中的所有案例创建一个parent_group,为C组创建另一个parent_group。谢谢!对不起,我还是不明白。假设您有一个“D”组。假设ID 8属于该组。身份证8票,身份证7票。那么所有的团体都是姐妹吗?@Iselzer是的!为了提供更多的背景,每个人都有一份他们可以提名的其他人的名单(他们的父母团队)。如果有人在你的家长组中,那么你也在他们的家长组中。但我不知道你在哪个家长组,这就是我想知道的。我所知道的是,一个家长小组由整个小组组成,最多三个。我知道每个人都在哪一组,他们提名哪一组。谢谢阿尼科!我认为这可以很容易地在BaseR中完成,但如果这个包使它更容易,那就太好了。谢谢Aniko!我认为这可以很容易地在BaseR中完成,但如果这个包使它更容易,那就太好了。