基于R中的向量/列对生成不同的组

问题描述 投票:2回答:1

请看下面的更新:

给定具有表示对象对的两列(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

这会产生数据框'组'....

     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相关联,以删除具有无效关系的组?这真让我难过。

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

r grouping distinct
1个回答
1
投票

以下是使用Rapplyunique基地进行此操作的一种方法

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
© www.soinside.com 2019 - 2024. All rights reserved.