为什么 sum() 在这个 dplyr 表达式中工作,而 quantile() 不是?
Why are sum() working in this dplyr expression while quantile() isn't?
我想计算数据框每一行的分位数,并将结果 return 作为矩阵。因为我想计算任意数量的分位数(我想一次计算它们会更快,而不是重新 运行 函数),我尝试使用我在 this question:
library(dplyr)
df<- as.data.frame(matrix(rbinom(1000,10,0.5),nrow = 2))
interim_res <- df %>%
rowwise() %>%
do(out = sapply(min(df):max(df), function(i) sum(i==.)))
interim_res <- interim_res[[1]] %>% do.call(rbind,.) %>% as.data.frame(.)
这是有道理的,但是当我尝试将相同的框架应用于 quantile()
函数时,如此处编码,
interim_res <- df %>%
rowwise() %>%
do(out = quantile(.,probs = c(0.1,0.5,0.9)))
interim_res <- interim_res[[1]] %>% do.call(rbind,.) %>% as.data.frame(.)
我收到此错误消息:
Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) :
'x' must be atomic
为什么 quantile
而不是 sum
出现错误?我该如何解决这个问题?
.
in do
是一个数据框,这就是你得到错误的原因。这有效:
df %>%
rowwise() %>%
do(data.frame(as.list(quantile(unlist(.),probs = c(0.1,0.5,0.9)))))
但有可能会非常慢。为什么不只是:
apply(df, 1, quantile, probs = c(0.1,0.5,0.9))
以下是一些数据较大的时序:
df <- as.data.frame(matrix(rbinom(100000,10,0.5),nrow = 1000))
library(microbenchmark)
microbenchmark(
df %>% rowwise() %>% do(data.frame(as.list(quantile(unlist(.),probs = c(0.1,0.5,0.9))))),
apply(df, 1, quantile, probs = c(0.1,0.5,0.9)),
times=5
)
产生:
min lq mean median uq max neval
dplyr 2375.2319 2376.6658 2446.4070 2419.4561 2454.6017 2606.0794 5
apply 224.7869 231.7193 246.7137 233.4757 245.0718 298.5144 5
如果你走 apply
路线,你应该从一开始就坚持使用矩阵。
我想计算数据框每一行的分位数,并将结果 return 作为矩阵。因为我想计算任意数量的分位数(我想一次计算它们会更快,而不是重新 运行 函数),我尝试使用我在 this question:
library(dplyr)
df<- as.data.frame(matrix(rbinom(1000,10,0.5),nrow = 2))
interim_res <- df %>%
rowwise() %>%
do(out = sapply(min(df):max(df), function(i) sum(i==.)))
interim_res <- interim_res[[1]] %>% do.call(rbind,.) %>% as.data.frame(.)
这是有道理的,但是当我尝试将相同的框架应用于 quantile()
函数时,如此处编码,
interim_res <- df %>%
rowwise() %>%
do(out = quantile(.,probs = c(0.1,0.5,0.9)))
interim_res <- interim_res[[1]] %>% do.call(rbind,.) %>% as.data.frame(.)
我收到此错误消息:
Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) :
'x' must be atomic
为什么 quantile
而不是 sum
出现错误?我该如何解决这个问题?
.
in do
是一个数据框,这就是你得到错误的原因。这有效:
df %>%
rowwise() %>%
do(data.frame(as.list(quantile(unlist(.),probs = c(0.1,0.5,0.9)))))
但有可能会非常慢。为什么不只是:
apply(df, 1, quantile, probs = c(0.1,0.5,0.9))
以下是一些数据较大的时序:
df <- as.data.frame(matrix(rbinom(100000,10,0.5),nrow = 1000))
library(microbenchmark)
microbenchmark(
df %>% rowwise() %>% do(data.frame(as.list(quantile(unlist(.),probs = c(0.1,0.5,0.9))))),
apply(df, 1, quantile, probs = c(0.1,0.5,0.9)),
times=5
)
产生:
min lq mean median uq max neval
dplyr 2375.2319 2376.6658 2446.4070 2419.4561 2454.6017 2606.0794 5
apply 224.7869 231.7193 246.7137 233.4757 245.0718 298.5144 5
如果你走 apply
路线,你应该从一开始就坚持使用矩阵。