【发布时间】: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() 应用于除x、y 和带有字符串'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