基于R中数据框中单个列的多个列的平均偏差

时间:2014-11-03 19:15:16

标签: r dataframe

这是我在这里发表的第一篇文章,我是R的新手。 我有一个巨大的数据文件,如下例所示。

> name = factor(c("A","B","C","D","E","F","G","H","H"))
>  school = c(1,1,1,2,2,2,3,3,3)
>  age = c(10,20,0,30,40,50,60,NA,70)
>  mark = c(100,70,100,50,90,100,NA,50,50)
>  data = data.frame(name=name,school=school,age=age)

name   school   age mark   (many other trait columns)
A      1        10   100
B      1        20    70
C      1        NA   100
D      2        30    50
E      2        40    90
F      2        50   100
G      3        60    NA
H      3        NA    50
H      3        70    50

我需要做的是计算每个学校的许多特征的平均值以及我想要创建到其他列的每个特征的平均值,其中一个特征是每个学校的特征平均值和另一个具有平均偏差的特征。我也有特征值"零"和" NA",我不想包括在平均计算中。我需要的文件如下所示:

name school   age   agemean  agedev  mark   markmean  markdev  (continue for other traits)
A      1      10        15     -5     100     90       10
B      1      20        15      5      70     90      -20
C      1       0        15      0     100     90       10
D      2      30        40    -10      50     80      -30
E      2      40        40      0      90     80       10
F      2      50        40     10     100     80       20
G      3      60        65     -5      NA     50        0
H      3      NA        65      0      50     50        0
H      3      70        65      5      50     50        0

我在这里搜索并发现了一些类似的问题,但我没有得到如何申请我的案子。我试图使用agreggate函数,但它无法正常工作。任何帮助将非常感谢。 欢呼声。

1 个答案:

答案 0 :(得分:2)

dplyr听起来不错。如果您想保留每所学校现有的所有行,请按以下步骤操作:

require(dplyr)
data %>%
  group_by(school) %>%
  mutate_each(funs(mean(., na.rm = TRUE), sd(., na.rm = TRUE)), -name)

#Source: local data frame [9 x 8]
#Groups: school
#
#  name school age mark age_mean mark_mean    age_sd  mark_sd
#1    A      1  10  100       15        90  7.071068 17.32051
#2    B      1  20   70       15        90  7.071068 17.32051
#3    C      1  NA  100       15        90  7.071068 17.32051
#4    D      2  30   50       40        80 10.000000 26.45751
#5    E      2  40   90       40        80 10.000000 26.45751
#6    F      2  50  100       40        80 10.000000 26.45751
#7    G      3  60   NA       65        50  7.071068  0.00000
#8    H      3  NA   50       65        50  7.071068  0.00000
#9    H      3  70   50       65        50  7.071068  0.00000

如果您想将每个学校缩减为单行摘要,可以在上面的代码中将mutate_each替换为summarise_each