【问题标题】:Take column value to another row and make it a new column将列值带到另一行并使其成为新列
【发布时间】:2021-09-08 08:07:16
【问题描述】:

我有一个数据集,其中包含一个 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 == 1 具有 partner_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

谢谢!

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    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
    

    【讨论】:

    • 相同但在 base 中:df$partner_value &lt;- df$value[match(df$partner_id, df$id)]
    • 这将失败如果你有1 6, 6 1, 2 6, 6 2
    【解决方案2】:

    在基础 R 中:

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

    【讨论】:

      【解决方案3】:

      你可以使用

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

      返回

         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
      

      【讨论】:

      • 谢谢,似乎有效。没想到那样做:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      相关资源
      最近更新 更多