我已经能够找到很多关于如何根据数字公式创建新列的答案,而不是名称。
我有一个融化的数据框,我需要创建一个新列,显示变量所属的类别。这是我当前数据框的一部分:
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来提供许多变量。我希望这能澄清一些事情。
答案 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
功能。
再次感谢大家的帮助!