2014-11-21 64 views
2

工作逐列在這種情況下,我試圖給quantile功能應用到這個例子中數據幀:mutate_each在dplyr不超過數據幀

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 

我在做什麼錯?

回答

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 

如果通過funs傳遞DFquantile,您會收到一個結果是一樣的整個數據幀上調用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 
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 
+1

我認爲在data.frame列上操作時,最好使用'lapply'或'sapply'。不需要再指定維度。 – thelatemail 2014-11-21 02:26:22

+0

你也不一定需要'function(x)...'part - 'lapply(DF,quantile,probs = 0.5)'例如。 – thelatemail 2014-11-21 04:05:21