代码之家  ›  专栏  ›  技术社区  ›  Nazer

将新的(较短的)列添加到TIBLE并扩展TIBLE以保持整洁

  •  3
  • Nazer  · 技术社区  · 6 年前

    我有一个数据框架,我需要添加一列来包含3个物种,它们对应于现有数据框架的每一行。希望下面的例子能说明这一点:

    Site    Year    Trt
    A       2016    bowl
    A       2016    vane
    A       2017    target
    A       2017    stick
    B       2016    bowl
    B       2016    vane
    B       2017    target
    B       2017    stick
    
    species<-c("species1", "species2", "species3")
    

    那我想去

    Site    Year    Trt     Species
    A       2016    bowl    species1
    A       2016    vane    species1
    A       2017    target  species1
    A       2017    stick   species1
    A       2016    bowl    species2
    A       2016    vane    species2
    A       2017    target  species2
    A       2017    stick   species2
    A       2016    bowl    species3
    A       2016    vane    species3
    A       2017    target  species3
    A       2017    stick   species3
    B       2016    bowl    species1
    B       2016    vane    species1
    B       2017    target  species1
    B       2017    stick   species1
    B       2016    bowl    species2
    B       2016    vane    species2
    B       2017    target  species2
    B       2017    stick   species2
    B       2016    bowl    species3
    B       2016    vane    species3
    B       2017    target  species3
    B       2017    stick   species3
    

    我想有些 rep 方法也可以,但真正的数据集有两个额外的列和141个物种。我对每件事都很挑剔。

    3 回复  |  直到 4 年前
        1
  •  6
  •   MKR    6 年前

    那么使用 tidyr::expand 将数据展开为:

    library(tidyverse)
    expand(data, nesting(Site, Year, Trt), species) %>% as.data.frame()
    
    #     Site Year    Trt  species
    # 1     A 2016   bowl species1
    # 2     A 2016   bowl species2
    # 3     A 2016   bowl species3
    # 4     A 2016   vane species1
    # 5     A 2016   vane species2
    # 6     A 2016   vane species3
    # 7     A 2017  stick species1
    # 8     A 2017  stick species2
    # 9     A 2017  stick species3
    # 10    A 2017 target species1
    # 11    A 2017 target species2
    # 12    A 2017 target species3
    # 13    B 2016   bowl species1
    # 14    B 2016   bowl species2
    # 15    B 2016   bowl species3
    # 16    B 2016   vane species1
    # 17    B 2016   vane species2
    # 18    B 2016   vane species3
    # 19    B 2017  stick species1
    # 20    B 2017  stick species2
    # 21    B 2017  stick species3
    # 22    B 2017 target species1
    # 23    B 2017 target species2
    # 24    B 2017 target species3
    

    数据

    data <- read.table(text = 
    "Site    Year    Trt
    A       2016    bowl
    A       2016    vane
    A       2017    target
    A       2017    stick
    B       2016    bowl
    B       2016    vane
    B       2017    target
    B       2017    stick",
    header = TRUE, stringsAsFactors = FALSE)
    
    species<-c("species1", "species2", "species3")
    
        2
  •  3
  •   akuiper    6 年前

    基本R解决方案利用 rep 方法:

    transform(
        do.call('rbind', rep(list(df), length(species))), 
        Species = rep(species, each=nrow(df))
    )
    
    #   Site Year    Trt  Species
    #1     A 2016   bowl species1
    #2     A 2016   vane species1
    #3     A 2017 target species1
    #4     A 2017  stick species1
    #5     B 2016   bowl species1
    #6     B 2016   vane species1
    #7     B 2017 target species1
    #8     B 2017  stick species1
    #9     A 2016   bowl species2
    #10    A 2016   vane species2
    #11    A 2017 target species2
    #12    A 2017  stick species2
    #13    B 2016   bowl species2
    #14    B 2016   vane species2
    #15    B 2017 target species2
    #16    B 2017  stick species2
    #17    A 2016   bowl species3
    #18    A 2016   vane species3
    #19    A 2017 target species3
    #20    A 2017  stick species3
    #21    B 2016   bowl species3
    #22    B 2016   vane species3
    #23    B 2017 target species3
    #24    B 2017  stick species3
    
        3
  •  1
  •   M--    6 年前

    另一个 base-R 解决方案是这样(您可以稍后 sort 基于 Site 列):

    cbind(dat, Species = rep(species, each = nrow(dat)))
    
    #    Site Year    Trt  Species
    # 1     A 2016   bowl species1
    # 2     A 2016   vane species1
    # 3     A 2017 target species1
    # 4     A 2017  stick species1
    # 5     B 2016   bowl species1
    # 6     B 2016   vane species1
    # 7     B 2017 target species1
    # 8     B 2017  stick species1
    # 9     A 2016   bowl species2
    # 10    A 2016   vane species2
    # 11    A 2017 target species2
    # 12    A 2017  stick species2
    # 13    B 2016   bowl species2
    # 14    B 2016   vane species2
    # 15    B 2017 target species2
    # 16    B 2017  stick species2
    # 17    A 2016   bowl species3
    # 18    A 2016   vane species3
    # 19    A 2017 target species3
    # 20    A 2017  stick species3
    # 21    B 2016   bowl species3
    # 22    B 2016   vane species3
    # 23    B 2017 target species3
    # 24    B 2017  stick species3