【问题标题】:Add a unique id for each matching pair of values between two columns in R为R中两列之间的每对匹配值添加一个唯一的ID
【发布时间】:2015-07-23 11:22:46
【问题描述】:

我想在下面的简单示例中为列 n1 和 n2 中的每对唯一值添加一个唯一 ID:

示例数据:

>dput(df)
structure(list(n1 = c(5L, 7L, 3L, 9L, 2L, 2L, 4L), y1 = c(1L, 
1L, 2L, 1L, 1L, 1L, 3L), n2 = c(7L, 5L, 4L, 2L, 4L, 4L, 2L), 
    y2 = c(1L, 3L, 1L, 2L, 2L, 3L, 2L)), .Names = c("n1", "y1", 
"n2", "y2"), class = "data.frame", row.names = c(NA, -7L))

>head(df)
  n1 y1 n2 y2 
1  5  1  7  1        
2  7  1  5  3
3  3  2  4  1
4  9  1  2  2
5  2  1  4  2
6  2  1  4  3

使用下面的代码,我可以根据 n1 列中相对于 n2 列的值组合添加一个唯一的对 id,但这不考虑 n1 和 n2 中的两个值具有相同组合但在两列中按顺序颠倒。例如,在下面的示例中,最后三行中的对组合是相同的,但是由于在最后一行中值的顺序颠倒了,因此该函数假定它们是不同的对组合)。

> dfn = transform(df, pairid = as.numeric(interaction(n1, n2, drop=TRUE)))

> dfn
  n1 y1 n2 y2 pairid
1  5  1  7  1      6
2  7  1  5  3      5
3  3  2  4  1      4
4  9  1  2  2      2
5  2  1  4  2      3
6  2  1  4  3      3
7  4  3  2  2      1

我想要的输出如下。

  n1 y1 n2 y2 pairid
1  5  1  7  1      4
2  7  1  5  3      4
3  3  2  4  1      3
4  9  1  2  2      2
5  2  1  4  2      1
6  2  1  4  3      1
7  4  3  2  2      1

【问题讨论】:

    标签: r match unique


    【解决方案1】:

    首先计算两个值中较小的一个,称为m1。然后两者中较大的一个,称为m2。然后应用你漂亮的交互技巧:

    df$pairid <- with(df, {m1 = ifelse(n1 < n2, n1, n2);
                           m2 = ifelse(n1 < n2, n2, n1);
                           return(as.numeric(interaction(m1, m2, drop=TRUE)))})
    

    给予

    > df
      n1 y1 n2 y2 pairid
    1  5  1  7  1      3
    2  7  1  5  3      3
    3  3  2  4  1      2
    4  9  1  2  2      4
    5  2  1  4  2      1
    6  2  1  4  3      1
    7  4  3  2  2      1
    

    【讨论】:

    • @kasterma:不幸的是,这不起作用。它根据 n1
    • 我完全没想到。修复即将到来。
    • @jjulip 这样做了吗?不确定我将错误的答案编辑成正确的(我希望的)答案是否不合适。
    • 不错的解决方案。如果将lex.order=TRUE 添加到interaction() 调用中,它将看起来与所需的输出完全相同。
    • @kasterma:非常感谢!效果很好。正是我想要的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 2021-08-12
    • 2021-04-09
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    相关资源
    最近更新 更多