dplyr中的mutate_each在数据帧上不按列工作

时间:2014-11-21 02:02:06

标签: r dplyr

在这种情况下,我正在尝试将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

我做错了什么?

2 个答案:

答案 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传递给quantilefuns,您将收到的结果与在整个数据框中调用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