将列值取到另一行并使其成为新列

Take column value to another row and make it a new column

我有一个数据集,其中包含一个 id 变量、一个合作伙伴 id 变量和一个值。换句话说,每个观察都与另一个观察配对。我想创建一个新变量,它采用一个伙伴的值并将其添加为一个新列。

下面我有一个示例数据:

set.seed(123)

df <- data.frame(id = c(1:10),
                 partner_id = c(6,7,8,9,10,1,2,3,4,5),
                 value = runif(10))

df

   id partner_id     value
1   1          6 0.2875775
2   2          7 0.7883051
3   3          8 0.4089769
4   4          9 0.8830174
5   5         10 0.9404673
6   6          1 0.0455565
7   7          2 0.5281055
8   8          3 0.8924190
9   9          4 0.5514350
10 10          5 0.4566147

正如我上面所说的,我想添加一个与合作伙伴的 (partner_id) value 的变量。例如,id == 1 的观察值有 partner_id == 6,因此,我想要一个新的第四列 (partner_value),其中 id == 1partner_value == 0.0455565.

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

   id partner_id     value partner_value
1   1          6 0.2875775     0.0455565
2   2          7 0.7883051     0.5281055
3   3          8 0.4089769     0.8924190
4   4          9 0.8830174     0.5514350
5   5         10 0.9404673     0.4566147
6   6          1 0.0455565     0.2875775
7   7          2 0.5281055     0.7883051
8   8          3 0.8924190     0.4089769
9   9          4 0.5514350     0.8830174
10 10          5 0.4566147     0.9404673

谢谢!

你可以使用

library(dplyr)

df %>% 
  left_join(df, 
            by = c("id" = "partner_id")) %>% 
  select(id, partner_id, value = value.x, partner_value = value.y)

这个returns

   id partner_id     value partner_value
1   1          6 0.2875775     0.0455565
2   2          7 0.7883051     0.5281055
3   3          8 0.4089769     0.8924190
4   4          9 0.8830174     0.5514350
5   5         10 0.9404673     0.4566147
6   6          1 0.0455565     0.2875775
7   7          2 0.5281055     0.7883051
8   8          3 0.8924190     0.4089769
9   9          4 0.5514350     0.8830174
10 10          5 0.4566147     0.9404673

来自 match

df %>%
  mutate(partner_value = value[match(partner_id, id)])

   id partner_id     value partner_value
1   1          6 0.2875775     0.0455565
2   2          7 0.7883051     0.5281055
3   3          8 0.4089769     0.8924190
4   4          9 0.8830174     0.5514350
5   5         10 0.9404673     0.4566147
6   6          1 0.0455565     0.2875775
7   7          2 0.5281055     0.7883051
8   8          3 0.8924190     0.4089769
9   9          4 0.5514350     0.8830174
10 10          5 0.4566147     0.9404673

在基数 R 中:

df <- merge(df, df[-1], by.x = "id", by.y = "partner_id")
names(df) <- c("id", "partner_id", "value", "partner_value")