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

时间:2016-11-07 18:15:00

标签: r calculated-columns

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

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

   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

我尝试使用内部和ifelse,但我认为我错过了它的关键部分,因为还没有任何工作。

提前致谢!

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

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

这意味着我想要使用相同的veg.type来提供许多变量。我希望这能澄清一些事情。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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",...)

希望这有帮助!

答案 2 :(得分:0)

制作第二个数据框,用作查找,然后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

答案 3 :(得分:0)

我以为我会发布我的解决方案:

我使用left_join像@Joe建议的那样。我有一个“查找”数据框,其中包含每个变量下的不同值,但我的原始数据帧是宽格式而不是长格式。我使用gather中的tidyr函数创建了一个长格式,这意味着我可以转换数据帧,而不会像reshape2中所需的那样保持一些id变量列相同melt功能。

再次感谢大家的帮助!

相关问题