这是我在这里发表的第一篇文章,我是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函数,但它无法正常工作。任何帮助将非常感谢。 欢呼声。
答案 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
。