如果列匹配,则从另一列中获取值并将其分配给新变量

If columns match, take value from another column and assign it to a new variable

我有一个数据集,其中包含一组 id 变量和一对 id 变量。每个观察都与另一个观察配对。我想创建一个新变量,该变量采用其配对伙伴的 id 变量并将其分配为新的 'partner' 变量。

下面我有一个示例数据:

id <- 1:10
pair_id <- rep(1:5,2)

df <- cbind(id, pair_id)

> df
      id pair_id
 [1,]  1       1
 [2,]  2       2
 [3,]  3       3
 [4,]  4       4
 [5,]  5       5
 [6,]  6       1
 [7,]  7       2
 [8,]  8       3
 [9,]  9       4
[10,] 10       5

正如我上面所说,我想添加一个变量来指示每个 id 伙伴的 id,其中伙伴关系用 pair_id 标识。例如,具有 id == 1 的观测值具有 pair_id == 1,这使得它成为具有 id == 6 的观测值的伙伴,因为它们共享 pair_id.

所以最终结果应该是这样的:

     id pair_id partner_id
 [1,]  1       1          6
 [2,]  2       2          7
 [3,]  3       3          8
 [4,]  4       4          9
 [5,]  5       5         10
 [6,]  6       1          1
 [7,]  7       2          2
 [8,]  8       3          3
 [9,]  9       4          4
[10,] 10       5          5

谢谢!

您可以反转每个 pair_idid 值:

library(dplyr)
df %>% group_by(pair_id) %>% mutate(partner_id = rev(id))

#      id pair_id partner_id
#   <int>   <int>      <int>
# 1     1       1          6
# 2     2       2          7
# 3     3       3          8
# 4     4       4          9
# 5     5       5         10
# 6     6       1          1
# 7     7       2          2
# 8     8       3          3
# 9     9       4          4
#10    10       5          5

基本 R 中的等价物:

df$partner_id <- with(df, ave(id, pair_id, FUN = rev))

data.table中是

library(data.table)
setDT(df)[, partner_id := rev(id), pair_id]

数据

df <- data.frame(id, pair_id)

我们可以使用

 library(dplyr)
df %>%
      group_by(pair_id) %>%
      mutate(partner_id = id[n():1])