如何在不使用FOR循环的情况下对R中矩阵中的每列执行多个操作?

时间:2016-04-08 12:40:13

标签: r for-loop lapply

假设我在R工作区中有如下数据框

   a b c d
s  1 2 3 4
t  2 4 5 6
u  1 9 7 6
v  9 2 3 4
w  3 2 0 2
x  3 2 0 9
y  9 2 4 3
z  8 3 4 5

如何在不使用R中的FOR LOOPS的情况下自动提取每列矩阵的范围,平均值,标准偏差,中位数,最大值和最小值?是否可以采用apply / sapply / lapply ??

2 个答案:

答案 0 :(得分:2)

这种情况有几种不同的选择。其他人提到apply函数,但apply适用于矩阵,如果给定数据框,它将在应用函数之前首先将其转换为矩阵。对于示例数据框,这不会成为问题(但首先转换效率很低),但如果与包含非数字列的数据框一起使用,则可能会出现问题。

最好使用直接在列表上工作的sapply(数据框是列表的一种形式):

> sapply(mtcars, function(x) c(mean(x), median(x), sd(x)))
           mpg      cyl     disp        hp      drat        wt      qsec
[1,] 20.090625 6.187500 230.7219 146.68750 3.5965625 3.2172500 17.848750
[2,] 19.200000 6.000000 196.3000 123.00000 3.6950000 3.3250000 17.710000
[3,]  6.026948 1.785922 123.9387  68.56287 0.5346787 0.9784574  1.786943
            vs        am      gear   carb
[1,] 0.4375000 0.4062500 3.6875000 2.8125
[2,] 0.0000000 0.0000000 4.0000000 2.0000
[3,] 0.5040161 0.4989909 0.7378041 1.6152

您可以通过更改上述功能来计算每列所需的功能。

您可能还需要考虑dplyr包,它具有执行此类操作的功能,其形式可能更具可读性,并且可以更简单的方式适应更复杂的情况。

> library(dplyr)
> mtcars %>% summarise_each(funs(mean,median,sd))
  mpg_mean cyl_mean disp_mean  hp_mean drat_mean wt_mean qsec_mean vs_mean
1 20.09062   6.1875  230.7219 146.6875  3.596563 3.21725  17.84875  0.4375
  am_mean gear_mean carb_mean mpg_median cyl_median disp_median hp_median
1 0.40625    3.6875    2.8125       19.2          6       196.3       123
  drat_median wt_median qsec_median vs_median am_median gear_median
1       3.695     3.325       17.71         0         0           4
  carb_median   mpg_sd   cyl_sd  disp_sd    hp_sd   drat_sd     wt_sd
1           2 6.026948 1.785922 123.9387 68.56287 0.5346787 0.9784574
   qsec_sd     vs_sd     am_sd   gear_sd carb_sd
1 1.786943 0.5040161 0.4989909 0.7378041  1.6152

> mtcars %>% summarise_each(funs(mean,median,sd)) %>% 
  matrix(nrow=ncol(mtcars), dimnames=list(names(mtcars), c('Mean','Median','SD')))
     Mean     Median SD       
mpg  20.09062 19.2   6.026948 
cyl  6.1875   6      1.785922 
disp 230.7219 196.3  123.9387 
hp   146.6875 123    68.56287 
drat 3.596563 3.695  0.5346787
wt   3.21725  3.325  0.9784574
qsec 17.84875 17.71  1.786943 
vs   0.4375   0      0.5040161
am   0.40625  0      0.4989909
gear 3.6875   4      0.7378041
carb 2.8125   2      1.6152   

答案 1 :(得分:0)

fun <- c('mean', 'sd', 'median', 'min', 'max')
sapply(fun, function(x) apply(dff, 2, match.fun(x)))

你会得到像这样的输出,

   mean       sd median min max
a 4.500 3.545621    3.0   1   9
b 3.250 2.434866    2.0   2   9
c 3.250 2.375470    3.5   0   7
d 4.875 2.167124    4.5   2   9