为R

时间:2015-07-23 11:22:47

标签: r match unique

我想在下面的简单示例中为列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

1 个答案:

答案 0 :(得分:2)

首先计算两个值中较小的一个,称之为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