用户工具

侧边栏

站点工具

本站推荐

最多访问

本页目录

您的足迹: • plyr

plyr包ddply函数之使用

我现在已经不教用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次。


页面工具

Powered by DokuWiki | ©2018-8102 Hong Wang | 桂ICP备18010616号 | 桂公网安备 45010302002017号