基于R中的向量/列对生成不同的组
见以下更新: 给定一个有两列(x1,x2)表示对象对的数据帧,我想生成组,其中每个组的所有成员都与该组中的所有其他成员配对。到目前为止,我已经能够通过显示x2中与x1中的每个项目配对的所有项目来生成组,但这就留下了一些组,其中一对成员仅与另一个组成员配对。我很难从这件事开始。。。提前感谢您提供的任何帮助。请让我知道,如果我应该编辑这篇文章,因为我是新的堆栈溢出和新的R编码基于R中的向量/列对生成不同的组,r,grouping,distinct,R,Grouping,Distinct,见以下更新: 给定一个有两列(x1,x2)表示对象对的数据帧,我想生成组,其中每个组的所有成员都与该组中的所有其他成员配对。到目前为止,我已经能够通过显示x2中与x1中的每个项目配对的所有项目来生成组,但这就留下了一些组,其中一对成员仅与另一个组成员配对。我很难从这件事开始。。。提前感谢您提供的任何帮助。请让我知道,如果我应该编辑这篇文章,因为我是新的堆栈溢出和新的R编码 x1 <- c("A", "B", "B", "B", "C", "C", "D", "D", "D", "E", "
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,对象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关联,以删除具有无效关系的组?这真让我难堪
对于上下文:我真正想做的是基于成对连接对项目进行分组,这些连接源于并非所有节点都连接的节点网络。这里有一种方法可以在base
R
中使用apply
和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"
数据表
(可能还有其他更好的方法)
谢谢你的帮助!我真的很感谢你抽出时间。您提出的解决方案适用于这种特殊情况,但我认为我提供的示例数据集过于有限,无法传达问题的全部范围。我将以更全面的观点以及我所取得的一些进展来编辑这个问题。
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
1 2 3 4 5
1 D B B B A
2 E D C C NULL
3 NULL NULL NULL F NULL
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"
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
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