【问题标题】:Generating distinct groups based on vector/column pairs in R基于 R 中的向量/列对生成不同的组
【发布时间】:2019-04-29 04:42:50
【问题描述】:

查看下面的更新:

给定一个包含两列 (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】:

    这是在基础R 中使用applyunique 的一种方法

    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
    

    【讨论】:

    • 感谢您的帮助 nsinghs!我真的很感谢你的时间。您提出的解决方案适用于这种特殊情况,但我认为我提供的示例数据集过于有限,无法传达问题的全部范围。我将编辑问题,更全面地了解问题以及我取得的一些进展。
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 2011-04-10
    • 2014-10-08
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多