根据R中的向量/列对生成不同的组

时间:2019-04-28 00:49:20

标签: r grouping distinct

请参阅下面的更新:

给出一个具有两列(x1,x2)表示对象对的数据框,我想生成一个组,其中每个组的所有成员都与该组中的所有其他成员配对。到目前为止,我已经能够通过显示x2中与x1中的每个项目配对的所有项目来生成组,但是这给我留下了几个成员仅与另一个组成员配对的组。我很难开始这一步……预先感谢您提供的任何帮助。请让我知道是否应该编辑这篇文章,因为我是Stack Overflow的新手,还是R编码的新手。

x1 <- c("A", "B", "B", "B", "C", "C", "D", "D", "D", "E", "E")
x2 <- c("A", "B", "C", "D", "B", "C", "B", "D", "E", "D", "E")

df <- data.frame(x1, x2)

我想从这个df转到看起来像df2的输出。

group1 <- c("A")
group2 <- c("B", "C")
group3 <- c("B", "D")
group4 <- c("D", "E")

df2 <- data.frame(cbind.fill(group1, group2, group3, group4, fill =   "NULL"))

更新:

给出以下数据集。...

x1 <- c("A", "B", "B", "B", "C", "C", "D", "D", "D", "E", "E", "B", "C", "F")
x2 <- c("A", "B", "C", "D", "B", "C", "B", "D", "E", "D", "E", "F", "F", "F")

df <- data.frame(x1, x2)

....我想确定x1 / x2的组,其中所述组内的所有对象都连接到该组的所有其他对象。

到目前为止,这是我所拥有的(我确信这是最佳实践错误,请随时予以解决。我很想学习)...

n <- nrow(as.data.frame(unique(df$x1)))

RosterGuide <- as.data.frame(matrix(nrow = n , ncol = 1)) 
RosterGuide$V1 <- seq.int(nrow(RosterGuide))
RosterGuide$Object <- (unique(df$x1))
colnames(RosterGuide) <- c("V1","Object")
groups_frame <- matrix(, ncol= length(n), nrow = length(n))

for (loopItem in 1:nrow(RosterGuide)) {

object <- subset(RosterGuide$Object, RosterGuide$V1 == loopItem)
group <- as.data.frame(subset(df$x2, df$x1 == object))

groups_frame <- cbind.fill(group, groups_frame, fill = "NULL")
}

Groups <- as.data.frame(groups_frame)
Groups <- subset(Groups, select = - c(object))
colnames(Groups) <- RosterGuide$V1

这将产生数据框“ Groups”。...

     1    2    3    4   5    6
1    F    D    B    B   B    A
2 NULL    E    D    C   C NULL
3 NULL NULL    E    F   D NULL
4 NULL NULL NULL NULL   F NULL

...正是我要寻找的,只是如果您查看原始df,则对象F和D永远不会配对,从而使第5组无效。同样,对象B和E永不配对,从而使第3组无效。有效的输出应如下所示……

     1    2    3   4   5 
1    D    B    B   B   A    
2    E    D    C   C  NULL
3   NULL NULL NULL F  NULL

问题:我可以通过某种方式将“组”数据框中上面列出的组与原始df相关联,以删除具有无效关系的组?这真让我难过。

对于上下文:我真正想做的是基于从不是所有节点都连接在一起的节点网络派生的成对连接的分组项目。

1 个答案:

答案 0 :(得分:1)

这是使用Rapply在基础unique中执行此操作的一种方法

df <- data.frame(x1, x2, stringsAsFactors = F)
df <- df[df$x1 != df$x2, ]
unique(t(apply(df, 1, sort)))

  [,1] [,2]
3 "B"  "C" 
4 "B"  "D" 
9 "D"  "E" 

dplyr

df %>%
  dplyr::filter(x1 != x2) %>%
  dplyr::filter(!duplicated(paste(pmin(x1,x2), pmax(x1,x2), sep = "-")))

  x1 x2
1  B  C
2  B  D
3  D  E

data.table (可能还有另一种更好的方法)

library(data.table)
as.data.table(df)[, .SD[x1 != x2]][, .GRP, by = .(x1 = pmin(x1,x2), x2 = pmax(x1,x2))]

   x1 x2 GRP
1:  B  C   1
2:  B  D   2
3:  D  E   3