续上一篇R快速入门笔记,本文是最近学习R的一些笔记心得。
log(e) 默认是以e为底的自然对数。如果以10为底则修改第二个参数即可。 exp 是e的指数函数,其他的指数计算直接用 x^n 即可,例如:
> log2(4) [1] 2 > log10(1) [1] 0 > log10(10) [1] 1 > log(10,10) [1] 1 > log(exp(1)) [1] 1 > 2^3 [1] 8
rep() : 输入重复元素
> rep(1, 8) [1] 1 1 1 1 1 1 1 1 > rep(c(1,2,3,4),8) [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 > array(1:12, dim=c(3,4)) [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 # 取其中一行/列 > array(1:12, dim=c(3,4))[2,] [1] 2 5 8 11 > array(1:12, dim=c(3,4))[,2] [1] 4 5 6
数据狂是一个类似关系数据库表的数据结构,其中每列的数据类型可以不同,但是数据长度必须一致。数据框非常适合用于数据分析,它的每一列可以代表数据的每个标量或属性,每一行代表一个样本。例如:
sex <- c('F','M','F','F','M') age <- c(23,43,51,32,60) city <- c('bj','sh','cd','sjz', 'hrb') people <- data.frame(city, age, sex) people$age people[,2] people[people$age>30,] #注意如果要显示所有数据,必须加逗号,[条件, ]。否则会显示undefined columns selected.
多个条件使用&,|和!来表示。
mean(people$age) 平均年龄
names(people)
nrow(people)
按排序显示:
ord1 <- order(people$age) people[ord1,]
实用factor因子来定义标签,可以重新定义标签值
> people$NSEX<-factor(people$sex, levels=c('F','M'), labels=c(1, 2)) > unique(people$age) [1] 23 43 51 32 60
可以用attach将数据框中的符号引入到全局空间中:
attach(people) The following objects are masked _by_ .GlobalEnv: age, city, sex
列表(List)是非常灵活的数据结构,它的不同元素可以是不同类型(每个元素可以当作一个R中的变量),也可以是不同的长度。
> l <- list() > l[["a"]] <- 1 > l[["b"]] <- "hello" > l[["c"]] <- c("h", "e", "l", "l", "o") > l $a [1] 1 $b [1] "hello" $c [1] "h" "e" "l" "l" "o"
另外使用list的常用场景是lapply, 调用函数的每一个返回值都会作为list中的成员:
lst <- lapply(dates, function() {...}, other_arguments) df <- df.rbindList(lst);
(1). cbind()让若干向量以列的方式拼成, rbind()以行(row)(2). 对矩阵一行/列来赋值
dmat <- matrix(nrow=8, ncol=4) dmat[,2]<-c(1,2,3,4,5,6,7,8)
(3). 同时对多个向量执行同一个操作
sapply(veg[, 5:9], FUN=mean)
(4). 取值形成矩阵
> table(people$city, people$age) 23 32 43 51 60 bj 1 0 0 0 0 cd 0 0 0 1 0 hrb 0 0 0 0 1 sh 0 0 1 0 0 sjz 0 1 0 0 0
(1). sum, min, max & prod 与 cumsum, cumprod, cummin, cummax(2). split函数可以根据某一列/某一条件来拆分
> a <- c(1,1,2,3,4,5,6,7,8,6) > d <- c(0,0,0,0,0,0,1,2,1,2)> dd <- data.frame(a, d) > split(dd$a, dd$d) $`0` [1] 1 1 2 3 4 5 $`1` [1] 6 8 $`2` [1] 7 6 > split(dd, dd$d) $`0` a d 1 1 0 2 1 0 3 2 0 4 3 0 5 4 0 6 5 0 $`1` a d 7 6 1 9 8 1 $`2` a d 8 7 2 10 6 2 > split(dd, dd$d==0) $`FALSE` a d 7 6 1 8 7 2 9 8 1 10 6 2 $`TRUE` a d 1 1 0 2 1 0 3 2 0 4 3 0 5 4 0 6 5 0
(3). order用于获得某一向量有序的索引,例如
> dd[order(dd$a), "a"] [1] 1 1 2 3 4 5 6 6 7 8
(1). sapply是simplify了的lapply,所谓的simplify,是指对结果的数据结构进行了simplify,方便后续处理。
sapply(scores, mean)
YuWen ShuXue
83.0 86.2
sapply(scores, quantile, probs=c(0.5,0.7,0.9))
YuWen ShuXue
50% 84.0 87.0
70% 88.6 96.6
90% 92.2 99.6
(2). tapply用于接收一系列向量并形成table,例如:
tapply(dd$a, dd$d, mean) 0 1 2 2.666667 7.000000 6.500000
apply中都有一个na.rm=TRUE选项,用于排除迭代向量中的NA值。
(4). R studio的source编辑页面可以用ctrl+n来执行
(5). 条件函数 *ifelse(条件,当条件满足时执行,当条件失败时执行)
等同于 if() {…} else {…}《R语言核心编程手册》《R统计学入门》