【问题标题】:using NSE in data.table in R在 R 的 data.table 中使用 NSE
【发布时间】:2020-04-13 16:05:57
【问题描述】:

我有一个名为client 的data.table,它包含以下列:

    "location"   "clientID"   "gender"     "age"  "startYear"  "ag1"        "ag2"      

age 变量和它的两个分解版本:ag1ag2

现在我想使用ag1 分解对我的数据进行分组:

agegroup <- sym(agegroup)
clientTotal <- client[,.(NOinsureds=length(clientID)), by = .(gender, agegroup, startYear)]

导致错误:

Show in New WindowClear OutputExpand/Collapse Output Error in [.data.table(clientData, , .(NOinsureds = length(clientID)), : column or expression 2 of 'by' or 'keyby' is type symbol. Do not quote column names. Usage: DT[,sum(colC),by=list(colA,month(colB))]

我认为这是因为NSE。我在网上读过一些关于它的信息,这就是为什么我包含agegroup &lt;- sym(agegroup),但它似乎不起作用。

有什么建议吗?

我会大量处理数据,我也会编写函数,所以在推荐解决方案时可能会记住这一点:)

【问题讨论】:

    标签: r data.table nse


    【解决方案1】:

    是的,您的问题似乎与 NSE 有关。您可以在by 中使用字符向量名称,而不是使用.()

    agegroup <- "ag1"
    clientTotal <- client[,.(NOinsureds=length(clientID)),
                            by = c("gender", agegroup, "startYear")]
    

    data.table 语法在功能上非常好,因为 `NSÈ 不难应用。如果它可以帮助你,我写了一篇关于NSE in data.table的帖子。您还可以在网上找到许多资源。

    【讨论】:

    • 重点是我不想使用字符向量,因为我的输入会发生变化(作为函数的一部分)。我是否想让我的数据按 ag2 分组,我只需更改agegroup &lt;- "ag2",然后更改agegroup &lt;- sym(agegroup) 并在data.table 中使用agegroup... 有意义吗?
    • 我不明白你为什么需要sym。你能举一个你想做的例子吗?在我的示例(刚刚编辑)中,您可以使用 agegroup
    • 如果您需要在[...]ij 维度中使用变量,示例会有所帮助
    • 顺便说一句,你的帖子很棒,很有帮助
    • 谢谢,很高兴它可以帮助别人!
    【解决方案2】:

    根据您在 cmets 中的说明,您应该可以使用 get()

    library(data.table)
    agegroup <- 'ag1'
    clientTotal <- client[,.(NOinsureds=length(clientID)), by = .(gender, age = get(agegroup), startYear)]
    

    考虑这个例子:

    library(data.table)
    cars <- data.table(mtcars)
    strBy <- "carb"
    cars[,.(avg.mpg = mean(mpg)), by = .(gear,Carborator = get(strBy))]
        gear Carborator  avg.mpg
     1:    4          4 19.75000
     2:    4          1 29.10000
     3:    3          1 20.33333
     4:    3          2 17.15000
     5:    3          4 12.62000
     6:    4          2 24.75000
     7:    3          3 16.30000
     8:    5          2 28.20000
     9:    5          4 15.80000
    10:    5          6 19.70000
    11:    5          8 15.00000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 2013-09-30
      • 2020-04-20
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多