2014-09-24 146 views
0

我正在寫一個函數,其輸出是未知列數據幀的彙總統計列表。例如,如果我的數據幀有3列,我的列表輸出需要是這樣:如何返回彙總統計清單?

col1 
col1mean 
(mean of column 1) 

col1 
col1median 
(median of column 1) 

col2 
col2$mean 
(mean of column 2) 

col2 
col2$median 
(median of column2) 

col3 
col3mean 
(mean of column 3) 

col3 
col3median 
(median of column 3) 

我的問題是,我怎麼能回到我的列表中,這樣它會通過均值,中位數和標準差週期爲n列?

+3

如何在當前目錄不能滿足您的需求?你打算如何「循環」思考這份清單,以及你打算如何使用這些價值?我不清楚問題是什麼。如果使用實際的可運行代碼和示例數據來創建一個[可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)以重新創建您的確切的問題。 – MrFlick 2014-09-24 15:37:44

回答

1

一種方法lapply

# example data 
set.seed(123) 
dat <- data.frame(col1 = rnorm(10), col2 = rnorm(10), col3 = rnorm(10)) 

lapply(dat, function(x) list(mean = mean(x), median = median(x), sd = sd(x))) 

結果:

$col1 
$col1$mean 
[1] 0.07462564 

$col1$median 
[1] -0.07983455 

$col1$sd 
[1] 0.9537841 


$col2 
$col2$mean 
[1] 0.208622 

$col2$median 
[1] 0.3802926 

$col2$sd 
[1] 1.038073 


$col3 
$col3$mean 
[1] -0.4245589 

$col3$median 
[1] -0.6769652 

$col3$sd 
[1] 0.9308092 
+0

謝謝!我剛在此之前: X < - sapply(X,平均值) ý< - sapply(X,中位數) ž< - sapply(X,SD) 列表(x [1],Y [1] ,z [1]) 但不知道如何推廣任何數量的列。 – Mole 2014-09-24 16:26:25

+0

此外,只是一個簡單的問題,所以我可以更好地理解它,但「function(x)」服務的目的是什麼? – Mole 2014-09-24 16:30:08

+0

@Mole函數(x)引入的函數(即list ...)應用於所有列。這裏'x'代表一列。 – 2014-09-24 16:50:27

2

我有一個功能,當我做這樣的工作。 easyStats()計算矢量的平均值,中位數,標準差,最大值和最小值。您可以使用lapply()輕鬆使用它,並且可能會產生比您所展示的更令人滿意的結果。以下是mtcars前三列的示例。如果有NA值,您還可以添加na.rm = TRUE

lapply(mtcars[1:3], easyStats) 
# $mpg 
# mean median  sd max min 
# 20.091 19.200 6.027 33.900 10.400 
# 
# $cyl 
# mean median  sd max min 
# 6.188 6.000 1.786 8.000 4.000 
# 
# $disp 
# mean median  sd  max  min 
# 230.722 196.300 123.939 472.000 71.100 

easyStats被定義爲

easyStats <- function (x, digits = 3L, ...) { 
    stopifnot(as.logical(length(x)), is.vector(x), is.numeric(x)) 
    funs <- c("mean", "median", "sd", "max", "min") 
    mp <- mapply(function(f, ...) match.fun(f)(x, ...), funs, ...) 
    round(mp, digits = digits) 
} 

但對於您特定的問題,你可以調節功能

easyStats2 <- function(x, funs = c("mean", "median", "sd"), digits = 3L, ...) { 
    mp <- mapply(function(f, ...) match.fun(f)(x, ...), funs, ...) 
    round(mp, digits = digits) 
} 

,然後調用與

lapply(mtcars[1:3], function(x) as.list(easyStats2(x))) 
+0

你應該使'funs'成爲一個默認值的參數。 – Roland 2014-09-24 15:42:05