使用名称列表基于公式创建新列

Creating a new column based on formula using list of names

我已经找到了很多关于如何基于数字公式而不是名称创建新列的答案。

我有一个融化的数据框,我需要为其创建一个新列来显示变量所属的类别。这是我当前数据框的一部分:

   Year Type        variable     value
1  2016    T Agrostis.canina         6
2  2016    R Agrostis.canina         2
3  2016    Q Agrostis.canina         0
4  2016    T Carex.nigra             0
5  2016    R Carex.nigra             9
6  2016    Q Carex.nigra             3
7  2015    T Agrostis.canina         0
8  2015    R Agrostis.canina         2
9  2015    Q Agrostis.canina         0
10 2015    T Carex.nigra             6
11 2015    R Carex.nigra             0
12 2015    Q Carex.nigra             5

我在工作环境中保存了每个类别下的变量名列表 - 我想使用这些来创建新列,因为有很多变量名!理想情况下,数据框看起来像这样:

   Year Type        variable     value    veg.type
1  2016    T Agrostis.canina         6    Graminoid
2  2016    R Agrostis.canina         2    Graminoid
3  2016    Q Agrostis.canina         0    Graminoid
4  2016    T Carex.nigra             0    Dwarf.shrub
5  2016    R Carex.nigra             9    Dwarf.shrub
6  2016    Q Carex.nigra             3    Dwarf.shrub
7  2015    T Agrostis.canina         0    Graminoid
8  2015    R Agrostis.canina         2    Graminoid
9  2015    Q Agrostis.canina         0    Graminoid
10 2015    T Carex.nigra             6    Dwarf.shrub
11 2015    R Carex.nigra             0    Dwarf.shrub
12 2015    Q Carex.nigra             5    Dwarf.shrub

我尝试使用 within 和 ifelse,但我认为我遗漏了其中的一个关键部分,因为还没有任何效果。

提前致谢!

编辑:每个 veg.type 基本上都是各种变量的子集,即

Dwarf.shrub <- c("Calluna.vulgaris", "Empetrum.nigrum", "Erica.cinerea"...) Graminoid <- c("Agrostis.canina", "Deschampsia.flexuosa", "Holcus.lanatus"...) 等等

这意味着我希望很多变量都具有相同的 veg.type。我希望这能澄清一些事情。

library(data.table)
output.df <- merge(df1, df2, by="variable", all.x=T)

all.x 参数表示您保留 df1 中的所有行。如果需要,您也可以执行 all.y 或完全将其保留为仅相交行。此外,如果您想合并多列,可以使用以下内容扩展 "by" 参数:

by=c("param 1 name","param 2 name",...)

希望对您有所帮助!

创建将用作查找的第二个数据框,然后 left_join() 将其添加到您的主数据框。 stack() 将列表直接转换为堆叠数据框。

df2 <- stack(list(Dwarf.Shrub=c("Carex.nigra", "Empetrum.nigrum"), Graminoid=c("Agrostis.canina", "Deschampsia.flexuosa"))) 

#                values         ind
#1          Carex.nigra Dwarf.Shrub
#2      Empetrum.nigrum Dwarf.Shrub
#3      Agrostis.canina   Graminoid
#4 Deschampsia.flexuosa   Graminoid

现在加入dplyr,给出两个数据框中键的变量名。

library(dplyr)
left_join(df, df2, by=c("variable" = "values"))

#   Year Type        variable value    veg.type
#1  2016    T Agrostis.canina     6   Graminoid
#2  2016    R Agrostis.canina     2   Graminoid
#3  2016    Q Agrostis.canina     0   Graminoid
#4  2016    T     Carex.nigra     0 Dwarf Shrub
# etc

最简单的方法是使用查找 table(您不需要 merge):

lookup <- list(Agrostis.canina="Graminoid", 
               Carex.nigra="Dwarf.shrub")
df$value <- lookup[df$variable]

我想我会post我的解决方案:

我像@Joe 建议的那样使用了 left_join。我有一个 "lookup" 每个变量下的不同值的数据框,但我的原始数据框是宽格式而不是长格式。我在 tidyr 中使用了 gather 函数来创建长格式,这意味着我可以转换数据框而无需保持某些 id 变量列与 reshape2 中似乎需要的相同melt 函数。

再次感谢大家的帮助!