我现在已经不教用plyr这个包了,因为R核心包函数足够方便,还更灵活。用R核心的包还有一个好处就是不会什么时候没有人维护就不兼容了。 这是之前教程里的内容,这里单独放一个页面,留个纪念吧。
基于如下数据框作为示例:
library(plyr) dat <- read.delim("ftp://ftp.biolab.wang/data/成绩.tsv", header=TRUE, sep='\t', encoding="GBK") str(dat) ## 'data.frame': 830 obs. of 7 variables: ## $ 学号 : num 71024000001 71024000001 71024000001 71024000001 71024000002 ... ## $ 姓名 : chr "梁全" "梁全" "梁全" "梁全" ... ## $ 班级 : chr "3班" "3班" "3班" "3班" ... ## $ 课程编号: int 1006001 1006017 1006036 1006002 1006001 1006017 1006036 1006002 1006001 1006017 ... ## $ 课程名称: chr "体育" "解剖学" "物理学" "英语" ... ## $ 学分 : num 2 4.5 4 4 2 4.5 4 4 2 4.5 ... ## $ 成绩 : int 76 81 61 61 77 83 75 67 80 72 ...
已知有的同学的有的课程成绩对应多个值,所以需要预先处理一下。这里我们取最高分作为代表,可以排序之后去重:
Dat <- dat[order(dat$成绩, decreasing = TRUE), ] Dat <- Dat[!duplicated(Dat[ , c("学号", "课程编号")]), ] nrow(Dat) ## [1] 809
也可以用ddply:
Dat <- ddply( .data = dat, .variable = names(dat)[1:6], .fun = summarize, 成绩 = max(成绩)) nrow(Dat) ## [1] 809 Dat <- ddply(dat, .(学号, 姓名, 班级, 课程编号, 课程名称, 学分), summarize, 成绩=max(成绩)) nrow(Dat) ## [1] 809 Dat <- ddply(dat, 1:6, summarize, 成绩=max(成绩)) nrow(Dat) ## [1] 809
用.函数可以省略掉引号,根据场景选用,会比较方便。参数按顺序给定,不需要写前边的参数名称。这里用到的summarize也是plyr包里的函数。因此,在运行这个ddply函数的时候,需要预先library好plyr包,如果未加载plyr包而使用plyr::ddply,那么括号里也要用plyr::.和plyr::summarize。
ddply函数用来拆分数据框、运用函数并且将结果以一个数据库的形式返回,比如这里可以很方便地使用ddply来进行多个值的计算:
stat <- ddply(Dat, .(学号, 姓名, 班级), summarize, 科目数 = length(成绩), 平均成绩 = mean(成绩), SD = sd(成绩), SEM = sd(成绩)/sqrt(length(成绩))) head(stat) ## 学号 姓名 班级 科目数 平均成绩 SD SEM ## 1 71024000001 梁全 3班 4 69.75 10.307764 5.153882 ## 2 71024000002 李海丽 3班 4 75.50 6.608076 3.304038 ## 3 71024000003 李昕婧 3班 4 75.25 6.291529 3.145764 ## 4 71024000004 廖娇 3班 4 80.75 2.217356 1.108678 ## 5 71024000005 陈雅文 3班 4 76.25 2.500000 1.250000 ## 6 71024000006 李清玲 3班 4 79.50 6.757712 3.378856
使用ddply来根据一列或多列来求另一列按这两列的值来分类的各种值,可自定义函数。这里后边的科目数、平均成绩、SD、SEM等都是给summarize函数的参数。
? ddply
查看更多的参数和更多的用法。
本网页已被访问152次。