【问题标题】:Calculate Percentage and other functions using data.table使用 data.table 计算百分比和其他函数
【发布时间】:2017-06-13 03:36:47
【问题描述】:

我想将聚合函数和百分比函数应用于列。我发现讨论聚合的线程 (Calculating multiple aggregations with lapply(.SD, ...) in data.table R package) 和讨论百分比的线程 (How to obtain percentages per value for the keys in R using data.table?Use data.table to calculate the percentage of occurrence depending on the category in another column),但不是两者兼而有之。

请注意,我正在寻找基于 data.table 的方法。 dplyr 不适用于实际数据集。

这是生成示例数据的代码:

set.seed(10)
  IData <- data.frame(let = sample( x = LETTERS, size = 10000, replace=TRUE), numbers1 = sample(x = c(1:20000),size = 10000), numbers2 = sample(x = c(1:20000),size = 10000))
  IData$let<-as.character(IData$let)

  data.table::setDT(IData)

这是使用dplyr生成输出的代码

Output <- IData %>%
    dplyr::group_by(let) %>%
    dplyr::summarise(numbers1.mean = as.double(mean(numbers1)),numbers1.median = as.double(median(numbers1)),numbers2.mean=as.double(mean(numbers2)),sum.numbers1.n = sum(numbers1)) %>%
    dplyr::ungroup() %>%
    dplyr::mutate(perc.numbers1 = sum.numbers1.n/sum(sum.numbers1.n)) %>%
    dplyr::select(numbers1.mean,numbers1.median,numbers2.mean,perc.numbers1)

示例输出(标题) 如果我运行head(output),我会得到:

  let numbers1.mean numbers1.median numbers2.mean perc.numbers1
  <chr>         <dbl>           <dbl>         <dbl>         <dbl>
    N     10320.951         10473.0      9374.435    0.03567927
    H      9683.590          9256.5      9328.035    0.03648391
    L     10223.322         10226.0      9806.210    0.04005400
    S      9922.486          9618.0     10233.849    0.03678742
    C      9592.620          9226.0      9791.221    0.03517997
    F     10323.867         10382.0     10036.561    0.03962035

这是我尝试使用data.table(不成功)

  IData[, as.list(unlist(lapply(.SD, function(x) list(mean=mean(x),median=median(x),sum=sum(x))))), by=let, .SDcols=c("numbers1","numbers2")] [,.(Perc = numbers1.sum/sum(numbers1.sum)),by=let]

我有 2 个问题:

a) 我如何使用data.table 解决这个问题?

b) 我看到上面的线程使用了prop.table。谁能指导我如何使用这个功能?

我真诚地感谢任何指导。

【问题讨论】:

    标签: r data.table dplyr


    【解决方案1】:

    我们可以使用与data.table类似的方法

    res <- IData[, .(numbers1.mean = mean(numbers1),
              numbers1.median = median(numbers1),
              numbers2.mean=mean(numbers2),
              sum.numbers1.n = sum(numbers1)), let
              ][, perc.numbers1 := sum.numbers1.n/sum(sum.numbers1.n)
               ][, c("let", "numbers1.mean",  "numbers1.median", 
                            "numbers2.mean", "perc.numbers1"), with = FALSE]
    
    head(res)
    #    let numbers1.mean numbers1.median numbers2.mean perc.numbers1
    #1:   N     10320.951         10473.0      9374.435    0.03567927
    #2:   H      9683.590          9256.5      9328.035    0.03648391
    #3:   L     10223.322         10226.0      9806.210    0.04005400
    #4:   S      9922.486          9618.0     10233.849    0.03678742
    #5:   C      9592.620          9226.0      9791.221    0.03517997
    #6:   F     10323.867         10382.0     10036.561    0.03962035
    

    【讨论】:

    • 对不起,愚蠢的问题:如果我不将上述代码分配给res,则不会发生任何事情。这与dplyr 不同,如果我不指定任何内容,dplyr 将在屏幕上输出结果,但在上述data.table 的情况下,这不会发生。为什么会这样?非常感谢您的想法。
    • @watchtwoer 如果您检查第一个[],我们正在汇总而不是在原始数据集中创建列。通过分配:=,我们只创建了一个新列。但是,在这段代码中,这发生在第一个 [] 之后,因此它不会更新原始数据。
    • @watchtower 关于打印,是因为:=。你最后需要[],即with =FALSE][]
    • 行得通!所以,对我来说,在使用:=(引用运算符)之后,我必须使用[] 来打印。我对么? dplyr by design 不能使用引用,因此默认情况下会打印。我的理解正确吗?感谢您的支持和帮助。
    • @watchtower 是的,如果你想在屏幕上打印输出。或者只是将它分配给一个新对象
    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多