【问题标题】:data.table: prettyNum() except for some columnsdata.table: prettyNum() 除了一些列
【发布时间】:2017-12-01 20:21:49
【问题描述】:

我有一个非常大的数据框(想想 30-5000 万条记录),因此我使用 data.table 来解决这个问题。我对dplyr 比对data.table 熟悉得多。

让我们考虑下面的小例子。请注意,我的实际数据集中还有更多列。

library(data.table)
library(magrittr)
library(stringi)

set.seed(42)

format_pct <- function(x){
  paste0(formatC(x * 100, digits = 1, format = 'f'), "%")
}

df <- data.frame(x = c(1, NA, 2, 4, NA),
                 y = c(0, 1, NA, 2, 5),
                 huge_numsf = sample.int(500000:1000000, size = 5),
                 huge_numsg = sample.int(500000:1000000, size = 5),
                 percent_a = format_pct(runif(5)),
                 percent_b = format_pct(runif(5)))

> df
   x  y huge_numsf huge_numsg percent_a percent_b
1  1  0     457404     259548     45.8%     94.0%
2 NA  1     468537     368294     71.9%     97.8%
3  2 NA     143070      67334     93.5%     11.7%
4  4  2     415222     328495     25.5%     47.5%
5 NA  5     320871     352530     46.2%     56.0%

我想将prettyNum() 应用于除xy 和带有字符串'percent' 的列之外的所有列。

如果这个数据框不大,我会这样做

df[,colnames(df)[
  !(colnames(df) %in% c("x", "y", colnames(df)[stri_detect_fixed(colnames(df), "percent")]))
  ]] <-  
  apply(X = df[,colnames(df)[
    !(colnames(df) %in% c("x", "y", colnames(df)[stri_detect_fixed(colnames(df), "percent")]))
    ]],
    MARGIN = 2,
    FUN = prettyNum,
    big.mark = ",")

> df
   x  y huge_numsf huge_numsg percent_a percent_b
1  1  0    457,404    259,548     45.8%     94.0%
2 NA  1    468,537    368,294     71.9%     97.8%
3  2 NA    143,070     67,334     93.5%     11.7%
4  4  2    415,222    328,495     25.5%     47.5%
5 NA  5    320,871    352,530     46.2%     56.0%

现在假设我们已经将df 变成了data.table;即:

df <- data.frame(x = c(1, NA, 2, 4, NA),
                 y = c(0, 1, NA, 2, 5),
                 huge_numsf = sample.int(500000:1000000, size = 5),
                 huge_numsg = sample.int(500000:1000000, size = 5),
                 percent_a = format_pct(runif(5)),
                 percent_b = format_pct(runif(5))) %>% 
  data.table(.)

有没有办法使用data.table 语法来完成上述操作?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这是一个data.table 解决方案。完整的披露信用应该转到我密切关注的上一篇文章。 How to apply same function to every specified column in a data.table

    cols<-c("x", "y", colnames(df)[stri_detect_fixed(colnames(df), "percent")])
    cols <- setdiff(colnames(df), cols)
    df[ , (cols) := lapply(.SD, prettyNum, big.mark = ","), .SDcols = cols]
    

    【讨论】:

    • 也许我做错了什么......但这似乎没有做任何事情?
    • 哦,您缺少以下内容:cols &lt;- setdiff(colnames(df), cols) - 需要在最后一行之前。此外,您还需要lapply(.SD, prettyNum, big.mark = ",")。一旦你解决了这些问题,我可以奖励你积分。
    • 进行了更改。
    • 也可以指定cols&lt;-colnames(df)[!stri_detect_fixed(colnames(df), "percent")][-1:-2],但前提是 x 和 y 始终是您的前 2 列。当然还有一百万种其他方法可以做到这一点。
    猜你喜欢
    • 2015-08-09
    • 2020-08-02
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2012-08-16
    • 2019-11-28
    • 2015-09-19
    • 2019-10-07
    相关资源
    最近更新 更多