【问题标题】:Simple data-manipulation in RR中的简单数据操作
【发布时间】:2011-05-10 19:03:32
【问题描述】:

@Aniko 指出,查看我的问题的一种方法是我需要找到图的连通分量,其中顶点称为组,变量 groupnominated_group 表示这两个组之间的边.我的目标是创建一个变量 parent_Group 来索引连接的组件。或者就像我之前说的:

我有一个包含四个变量的数据框:IDgroupnominated_IDnominated_Group

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

我想创建一个变量parent_group,它对每组姐妹组都有一个唯一的值。换言之,不同parent_groups 的案件之间不应出现提名。制作parent_group 序列号似乎是个好主意。

非常感谢我已经收到here 的帮助!我不能在这里真正做出贡献,但请注意,我会尝试在 stats.exchange 和 wikipedia 上进行支付。

在我的假数据中,A 和 B 是姐妹组。无论是 ID=4 还是 ID=5 都足以证明这一点。每个小组也是他们自己的姐妹小组。目标,parent_group 的创建,应该为 A 或 B 中的所有案例产生一个 parent_group,为组 C 产生另一个 parent_group

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

【问题讨论】:

  • 不明白姐妹团是怎么定义的。或许你可以根据假数据举个例子?
  • 很抱歉不清楚,为了清楚起见,我将编辑原件:如果数据中有一个单独的案例,其中 group==A 和 named_group,则 A 组和 B 组是姐妹组==B,反之亦然。在我的假数据中,A和B确实是姐妹组。无论是 ID=4 还是 ID=5 都足以证明这一点。每个小组也有自己的姐妹小组。目标是创建 parent_group,应该为 A 或 B 中的所有案例创建一个 parent_group,为组 C 生成另一个 parent_group。谢谢!
  • 对不起,我还是没跟上。假设您有一个“D”组。并说 ID 8 属于该组。并且 ID 8 投票 ID 7。那么所有的组都是姐妹?
  • @Iselzer 是的!为了提供更多背景信息,每个人都获得了他们可以提名的其他人的列表(他们的 parent_group)。如果有人在您的 parent_group 中,那么您也在他们的 parent_group 中。但我不知道你在哪个parent_group,这就是我想弄清楚的。我所知道的是 parent_group 由整个组组成,最多三个。我知道每个人在哪个组,以及他们提名的组。

标签: r vectorization data-manipulation


【解决方案1】:

考虑一个以组为顶点的图,边表示两个组的 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

【讨论】:

  • 谢谢阿尼科!我认为这可以在基础 R 中轻松完成,但如果这个包使它更容易,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
相关资源
最近更新 更多