代码之家  ›  专栏  ›  技术社区  ›  Fabio Favoretto

用第二个数据帧中定义的类别替换数据帧列名的公式

  •  0
  • Fabio Favoretto  · 技术社区  · 6 年前

    假设我有宽格式的数据(行中的样本和列中的物种)。

    species <- data.frame(
        Sample = 1:10, 
        Lobvar = c(21, 15, 12, 11, 32, 42, 54, 10, 1, 2), 
        Limtru = c(2, 5, 1, 0, 2, 22, 3, 0, 1, 2), 
        Pocele = c(3, 52, 11, 30, 22, 22, 23, 10, 21, 32), 
        Genmes = c(1, 0, 22, 1, 2,32, 2, 0, 1, 2)
    )
    

    我想根据我对所有物种的功能组的引用,自动更改物种名称(因此即使我在数据集中的引用比实际物种多,它也能工作),例如:

    reference <- data.frame(
        Species_name = c("Lobvar", "Ampmis", "Pocele", "Genmes", "Limtru", "Secgio", "Nasval", "Letgos", "Salnes", "Verbes"), 
        Functional_group = c("Crustose", "Geniculate", "Erect", "CCA", "CCA", "CCA", "Geniculate", "Turf","Turf", "Crustose"),
        stringsAsFactors = FALSE
    )
    

    编辑

    多亏了@dany的建议,我现在可以将物种名称更改为它们的功能组名称:

    names(species)[2:ncol(species)] <- reference$Functional_group[match(names(species), reference$Species_name)][-1]
    

    然而,在我的实际生活中数据框我有更多的物种,这在不同的列中创建了许多同名的官能团。我现在要对具有相同名称的列求和。我更新了这个示例以给出一个结果,其中有多个具有相同名称的函数组。

    所以我明白了:

    Sample Crustose CCA Erect CCA Crustose
          1       21   2     3   1        2
          2       15   5    52   0        3
          3       12   1    11  22        4
          4       11   0    30   1        1
          5       32   2    22   2        0
          6       42  22    22  32        0
    

    我想要的最终结果是:

    Sample Crustose CCA Erect
      1       23      3     3     
      2       18      5    52    
      3       16     22    11       
      4       12      1    30       
      5       32      4    22       
      6       42     54    22 
    

    你对这件事有何建议?谢谢你的帮助和我收到的建议。

    1 回复  |  直到 6 年前
        1
  •  0
  •   DanY    6 年前

    我们可以使用 match 要进行名称查找:

    names(species)[2:ncol(species)] <- reference$Functional_group[match(names(species), reference$Species_name)][-1]
    

    mapply 这个 rowSums 在对colnames执行一些正则表达式操作之后执行函数:

    namevec <- gsub("\\.[[:digit:]]", "", names(df))
    mapply(function(x) rowSums(df[which(namevec == x)]), unique(namevec))