为 R 中两列之间的每个匹配值对添加一个唯一 ID
Add a unique id for each matching pair of values between two columns in R
我想在下面的简单示例中为列 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
首先计算两个值中的较小者,称之为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
我想在下面的简单示例中为列 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
首先计算两个值中的较小者,称之为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