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