在这种情况下,我正在尝试将quantile
函数应用于此示例数据框:
DF <- as.data.frame(matrix(runif(9, 1, 10),ncol=3,nrow=3))
DF_of_quantiles <- DF %>%
mutate_each(funs(quantile(DF,c(0.98), na.rm=TRUE)))
但是mutate_each
不会对列执行该功能:
View(DF_of_quantiles)
给出
V1 V2 V3
1 9.822732 9.822732 9.822732
2 9.822732 9.822732 9.822732
3 9.822732 9.822732 9.822732
请注意
View(quantile(DF,c(0.98), na.rm=TRUE)
给出相同的值:
row.names x
1 98% 9.822732
我做错了什么?
答案 0 :(得分:3)
使用dplyr::funs()
时,不要忘记您需要在要传递数据的参数中使用.
作为伪参数,这意味着它将被写入
quantile(., 0.98, na.rm = TRUE)
在funs
内。此外,对于此操作,我认为您可能更喜欢summarise_each
。
library(dplyr)
summarise_each(DF, funs(quantile(., 0.98, na.rm=TRUE)))
# V1 V2 V3
# 1 4.868255 6.937773 7.864751
如果您将DF
传递给quantile
到funs
,您将收到的结果与在整个数据框中调用quantile
相同:
summarise_each(DF, funs(quantile(DF, 0.98, na.rm=TRUE)))
# V1 V2 V3
# 1 7.830681 7.830681 7.830681
quantile(as.matrix(DF), 0.98, names = FALSE)
# [1] 7.830681
您在mutate_each
电话中看到的是什么,但不是您想要的。此外,mutate_each
.
会产生正确但不良的结果
mutate_each(DF, funs(quantile(., 0.98, na.rm=TRUE)))
# V1 V2 V3
# 1 4.868255 6.937773 7.864751
# 2 4.868255 6.937773 7.864751
# 3 4.868255 6.937773 7.864751
检查:
vapply(DF, quantile, 1, 0.98)
# V1 V2 V3
# 4.868255 6.937773 7.864751
答案 1 :(得分:3)
如果有人遇到此问题,并且内置函数apply正常。
# 2 mean column wise, 1 means row wise
> apply(DF, 2, function(x)quantile(x, 0.5))
V1 V2 V3
5.953192 8.144576 3.528949
感谢thelatemail的建议,我添加了lapply的输出,sapply和输出。
> lapply(DF, function(x)quantile(x, 0.5))
$V1
50%
5.953192
$V2
50%
8.144576
$V3
50%
3.528949
> sapply(DF, function(x)quantile(x, 0.5))
V1.50% V2.50% V3.50%
5.953192 8.144576 3.528949