【问题标题】:Creating a new column based on formula using list of names使用名称列表基于公式创建新列
【发布时间】:2016-11-07 18:15:00
【问题描述】:

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

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

   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

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

提前致谢!

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

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

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

【问题讨论】:

  • 是否有用于连接数据的密钥?检查 ?merge in basic R or。 left_join 在 dplyr 中,我最建议用于数据操作
  • 你在什么基础上为 veg.type 列赋值?
  • 我有列表或每个 veg.type 下带有变量的数据框列表是(例如):Dwarf.shrub &lt;- c("Calluna.vulgaris", "Empetrum.nigrum", "Erica.cinerea"...) Graminoid &lt;- c("Agrostis.canina", "Deschampsia.flexuosa", "Holcus.lanatus"...) 等。如您所见,每个 veg.type 下有多个变量 - 超过 3 个我已经展示了。 mergeleft_join 对于我需要做的事情,如下所示不起作用。

标签: r calculated-columns


【解决方案1】:

最简单的就是使用查表(也不需要merge):

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我的环境中的每个 veg.type 都有列表,或者我可以使用它们的数据框 - 每个 veg.type 中有多个变量,而不仅仅是数据框中显示的一个我提供的。我不认为我可以 mergeleft_join 这样的数据帧。
    • 您可以通过多个变量加入,如果这就是您的意思。例如,请参阅this answer。听起来您想从列表中创建一个查找数据框并通过多个变量加入。
    • 这不是我的意思。我在上面留下了评论,可能会有所帮助。基本上每个 veg.type 都是变量的子集,我在每个 veg.tye 下都有变量列表,例如:Dwarf.shrub &lt;- c("Calluna.vulgaris", "Empetrum.nigrum", "Erica.cinerea"...) Graminoid &lt;- c("Agrostis.canina", "Deschampsia.flexuosa", "Holcus.lanatus"...) 也许我需要先对数据进行子集化。
    • 好的。如何使用您的列表和stack()df2 &lt;- stack(list(Dwarf.Shrub=c("Carex.nigra", "Empetrum.nigrum"), Graminoid=c("Agrostis.canina", "Deschampsia.flexuosa"))) 然后left_join(df, df2, by=c("variable" = "values")) 进行查找df。让我知道它是否有效。
    • 成功了!我的问题是我有宽格式而不是长格式的查找数据框。我使用tidyr gather 更改了它。感谢您的帮助!! :-D
    【解决方案3】:
    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",...)
    

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      我想我会发布我的解决方案:

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

      再次感谢大家的帮助!

      【讨论】:

      • 不客气。请考虑接受其中一个答案并支持所有碰巧有用的答案... :-)
      • 对不起,我忘了打勾是你接受答案的方式! (哎呀)
      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 2020-12-13
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      相关资源
      最近更新 更多