【问题标题】:Append columns to data.table, sort and avoid setDT将列附加到 data.table,排序并避免 setDT
【发布时间】:2019-07-26 17:01:15
【问题描述】:

我有一些简单的数据表代码 - 它(几乎)完美运行,但我确信它可以改进。

我在网上搜索过,但找不到这种情况的解决方案。

这是我的代码:

library(data.table)
df <- read.csv(file="data.csv", header = TRUE, stringsAsFactors = FALSE)
x <- df[Question.Number==9, .(sum(LoadedCount)), keyby = .(Provider)]
y <- df[Question.Number==9 & Response!='no experience', .(sum(Count)), keyby = .(Provider)]
z <- list(x$Provider, x$V1/y$V1)
setDT(z)
a <- z[, .(Provider = V1, TotalAverage = V2), keyby=.(TotalAverage = V2)]
a

结果是

 TotalAverage        Provider TotalAverage
 1:    0.7312500         A    0.7312500
 2:    0.7334416         B    0.7334416
 3:    0.7451613         C    0.7451613
 4:    0.7823718         D    0.7823718
 5:    0.7904412         E    0.7904412
 6:    0.8151316         F    0.8151316
 7:    0.8172840         G    0.8172840
 8:    0.8327586         H    0.8327586
 9:    0.8363333         I    0.8363333
10:    0.8893939         J    0.8893939

问题: 我可以在一排或更有效地做 x/y 吗? 如果我确实需要步骤 z,如何直接将其制作为表格(没有 List 和 setDT)? 如何在不重复该列的情况下按 TotalAverage 对步骤“a”进行排序?

非常感谢!

【问题讨论】:

  • 我可以建议您在问题标题中更具体吗?
  • 您应该提供示例数据。另外,不要使用read.csv,而是使用fread

标签: r data.table


【解决方案1】:

也许可以尝试类似的方法(警告未经任何数据测试):

setDT(df)[Question.Number==9, {
        x <- sum(LoadedCount)
        .(TotalAverage = x / .SD[Response!='no experience', sum(Count)])
    }, 
    keyby=.(Provider)]

【讨论】:

    【解决方案2】:

    在@chinsoon12 和@cole 的建议下,我想出了解决方案:

    library(data.table)
    DT <- fread("data.csv")
    x <- DT[`Question Number` == 9, {
          g <- sum(LoadedCount)
          .(TotalAverage = g / .SD[Response != 'no experience', sum(Count)])
      },
      keyby=.(Provider)][order(TotalAverage)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 2016-08-08
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多