【问题标题】:How can I add a set of rows to each distinct observation in R如何在 R 中为每个不同的观察添加一组行
【发布时间】:2021-11-23 02:13:15
【问题描述】:

我希望在 R 中实现以前手动完成且非常耗时的流程自动化。我想将来自一个数据帧的一系列观察结果添加到另一个数据帧中的每个唯一变量。使用数据的示例可能会更好地说明这一点...

表一包含每种动物的一些观察结果,这是我要为每种动物添加一组行的表。

Animal Colour Temperament
Cat Black Calm
Dog Beige Anxious
Cat White Playful

表二显示了应该应用于每只动物的行。

Colour Temperament
Brown Control
Beige Control
White Control

决赛桌应该是这样的:

Animal Colour Temperament
Cat Black Calm
Dog Beige Anxious
Cat White Playful
Cat Brown Control
Cat Beige Control
Cat White Control
Dog Brown Control
Dog Beige Control
Dog White Control

有人能指出我正确的方向吗? Pref 在基础 R 上使用 tidyverse(但不是必需的:))

【问题讨论】:

    标签: r tidyverse data-manipulation


    【解决方案1】:

    1.我们创建了一个易于使用且可重现的示例数据

    d1 <- data.frame(an = c("c", "d", "c"), 
                     cl = c("bl", "be", "wh"),
                     tm = c("cl", "an", "pl"))
    
    d2 <- data.frame(cl = c("br", "be", "wh"),
                     tm = "cn")
    

    2.使用expand_grid结合tidyr::full_join将data.frame d1扩展为所需的形式:

    library(dplyr)
    library(tidyr)
    
    d1 %>% 
      full_join(expand_grid(d2, an = unique(d1$an)))
    

    这会返回:

      an cl tm
    1  c bl cl
    2  d be an
    3  c wh pl
    4  c br cn
    5  d br cn
    6  c be cn
    7  d be cn
    8  c wh cn
    9  d wh cn
    

    【讨论】:

      【解决方案2】:

      使用crossing

      library(dplyr)
      library(tidyr)
      crossing(d2, an = d1$an) %>% 
          full_join(d1)
      Joining, by = c("cl", "tm", "an")
      # A tibble: 9 × 3
        cl    tm    an   
        <chr> <chr> <chr>
      1 be    cn    c    
      2 be    cn    d    
      3 br    cn    c    
      4 br    cn    d    
      5 wh    cn    c    
      6 wh    cn    d    
      7 bl    cl    c    
      8 be    an    d    
      9 wh    pl    c    
      

      数据

      d1 <- structure(list(an = c("c", "d", "c"), cl = c("bl", "be", "wh"
      ), tm = c("cl", "an", "pl")), class = "data.frame", row.names = c(NA, 
      -3L))
      
      d2 <- structure(list(cl = c("br", "be", "wh"), tm = c("cn", "cn", "cn"
      )), class = "data.frame", row.names = c(NA, -3L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-08
        • 2023-02-20
        • 2023-01-27
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多