March 19, 2016

R 语言学习笔记

R 语言学习系列参考书籍:《R语言实战》

(一)入门

1. 工作空间:

getwd():查看当前工作目录 setwd("mydirectory"):设定当前工作目录为mydirectory ls():列出当前工作空间中的对象 savehistory(" myfile"):保存命令历史到文件myfile中 save.image(" myfile"):保存工作空间到文件myfile中 q():退出R

2. 包

install.packages():安装包 library():载入包

3. 数据结构

(1) 向量

a <- c(1, 2, 3, 4, 5)
b <- c("one", "two", "three")

(2) 矩阵

  • 创建一个5*4的矩阵
y <- matrix(1:20, nrow=5, ncol=4)
  • 按行填充的2*2矩阵
cells <- c(1, 26, 24, 68)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2")
mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames))
  • 按列填充的2*2矩阵
mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=FALSE, dimnames=list(rnames, cnames))

(3) 数组

dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2", "B3")
dim3 <- c("C1", "C2", "C3", "C4")
z <- array(1:24, c(2, 3, 4), dimnames=list(dim1, dim2, dim3))

(4) 数据框

数据框可通过函数data.frame()创建。

patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)

选取数据框中的元素:

patientdata
patientdata[1:2]
patientdata[c("diabtets", "status")]
patientdata$age

$用来选取一个给定数据框中的某个特定变量:

table(patientdata$diabetes, patientdata$status)

可以联合使用函数attach()detach(),或者单独使用函数with()来简化代码:

函数attach()可将数据可添加到R的搜索路径中; 函数detach()将数据框从搜索路径中移除;

代码(1)

summary(mtcars$mpg)
plot(mtcars$mpg, mtcars$disp)
plot(mtcars$mpg, mtcars$wt)

代码(2)

attach(mtcars)
  summary(mpg)
  plot(mpg, disp)
  plot(mpg, wt)
detach(mtcars)

代码(3)

with(mtcars,{
  summary(mpg, disp, wt)
  plot(mpg, disp)
  plot(mpg, wt)
})

(5) 因子

(6) 列表

4. 数据的输入

(1) 使用键盘输入数据

mediate <- data.frame(age=numeric(0), gender=character(0), weight=numeric(0))
mydata <- edit(mydata)

(2) 从带分隔符的文本文件导入数据

read.table()

grades <- read.table("studentgrades.csv", header=TRUE, sep=",", row.names="STUDENTID")

5. 数据集的标注

(1)变量标签

names(patientdata)[2] <- "Age at hospitalization (in years)"

(2) 值标签

patientdata$gender <- factor(patientdata$gender, levels=c(1,2), labels=c("male", "female"))

这里levels代表变量的实际值,而labels表示包含了理想值标签的字符型向量。

(二)图形初阶

1. 使用图形

attach(mtcars)
plot(wt, mpg)
abline(lm(mpg~wt))
title("Regression on MPG on Weight")
detach(mtcars)

保存到当前工作目录:

pdf("mygraph.pdf")
  attach(mtcars)
  plot(wt, mpg)
  abline(lm(mpg~wt))
  title("egression on MPG on Weight")
  detach(mtcars)
dev.off()

2. 一个简单的例子

输入数据:

dose <- c(20,30,40,45,60)
drugA <- c(16,20,27,40,60)
drugB <- c(15,18,25,31,40)

创建一幅描述药物A的剂量和响应关系的图形:

plot(dose, drugA, type= "b")

plot()是R中为对象作图的一个泛型函数

3. 图形参数

上例中,使用实心三角而不是空心圆圈作为点的符号,而且用虚线代替实线连接这些点:

opar <- par(no.readonly=TRUE)
par (lty=2, pch=17)
plot(dose, drugA, type= "b")
par(opar)

lay = 2: 将默认的线条类型修改为虚线 pct = 17: 将默认的点的符号改为实心三角

(1) 符号和线条

参数描述:

pch:绘制点使用的符号 cex:符号的大小 lty:线条类型 lwd:线条宽度

示例:

plot(dose, drugA, type="B", lty=3, lwd=3, pch=15, cex=2)

(2) 颜色

(3) 文本属性

(4) 图形尺寸和边界尺寸

(三)基本数据管理

1. 创建leadership数据框

manager <- c(1, 2, 3, 4, 5)
date <- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
country <- c("US","US","UK","UK","UK")
gender <- c("M","F","F","M","F")
age <- c(32, 45, 25, 39, 99)
q1 <- c(5, 3, 3, 3, 2)
q2 <- c(4, 5, 5, 3, 2)
q3 <- c(5, 2, 5, 4, 1)
q4 <- c(5, 5, 5, NA, 2)
q5 <- c(5, 5, 2, NA, 1)
leadership <- data.frame(manager, date, country, gender, age, q1, q2, q3, q4, q5, stringsAsFactor=FALSE)

2. 创建新变量

法(1):

mydata <- data.frame( x1 = c(2, 2, 6, 4), x2 = c(3, 4, 2, 8))
mydata$sumx <- mydata$x1 + mydata$x2
mydata$meanx <- (mydata$x1 + mydata$x2)/2

法(2):

attach(mydata)
mydata$sumx <- x1 + x2
mydata$meanx <- (x1 + x2)/2
detach(mydata)

法(3):

mediate <- transform(mediate, sum = x1 + x2, meanx = (x1 + x2)/2)

3. 变量的重编码

(1) 将99岁的年龄值重编码为缺失值

leadership$age[leadership$age == 99] <- NA

(2) 创建变量agecat (Young, Middle, Aged, Elder)

leadership$agecat[leadership$age > 75] <- "Elder"
leadership$agecat[leadership$age > 55 & leadership$age <= 75] <- "Middle Aged"
leadership$agecat[leadership$age < 55] <- "Young"

这段代码可以写成更紧凑的:

leadership <- within(leadership, {agecat <- NA
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <= 75] <- "Middle Aged"
agecat[age < 55] <- "Young"})

4. 变量的重命名

(1) 调用交互式编辑器进行变量重命名:

fix(leadership)

(2) 以编程方式修改变量名,使用 rename() 函数:

library(reshape)
leadership <- rename(leadership, c(manager = "managerID", date = "testDate"))

(3) 通过names()函数来重命名变量:

names(leadership)[2] <- "testDate"
names(leadership)[6:10] <- c("item1", "item2", "item3", "item4", "item5")

5. 缺失值

(1) 检测缺失值是否存在:

is.na()
is.na(leadership[,6:10])  将数据框限定到第6列至第10列

(2) 重编码某些值为缺失值:

leadership$age[leadership$age == 99] <- NA

(3) 使用na.rm=TRUE,在计算之前移除缺失值并使用剩余值计算:

x <- c(1, 2, NA, 3)
y <- sum(x)  这里y的值为NA
y <- sum(x, na.rm=TRUE)  这里y等于6

(4) 使用na.omit(),移除所有含有缺失值的观测(行删除,listwise deletion)

na.omit()可以删除所有含有缺失数据的行:

newdata <- na.omit(leadership)
仅含完整观测的数据框在结果被保存到newdata之前所有包含缺失数据的行均已从leadership中删除

6. 日期值

日期值通常以字符串的形式输入到R中,然后转化为以数值形式存储的日期变量,函数as.Date()用于执行这种转化,其语法是

as.Date(x, "input_format")

mydates <- as.Date(c("2007-06-22", "2004-02-13"))

strDates <- c("01/05/1965","08/16/1975")
dates <- as.Date(strDates, "%m/%d/%Y")

myformat <- "%m/%d/%y"
leadership$date <- as.Date(leadership$date, myformat)

使用函数as.character()将日期转换成字符型变量:

strDates <- as.character(dates)

7. 类型转换

名为is.datatype()这样的函数返回TRUEFALSE,而as.datatype()这样的函数则将其参数转换为对应的类型。

a <- c(1, 2, 3)
a <- is.numeric(a)
a <- as.charachter(a)

8. 数据排序

使用order()函数对一个数据框进行排序

newdata <- leadership[order(leadership$age),]
 各行依经理人的年龄升序排序
newdata <- leadership[order(gender, age),]
 各行依女性到男性同样性别中按年龄升序排序
newdata <- leadership[order(gender, -age),]
 各行依经理人性别和年龄降序排序

9. 数据集的合并

(1) 添加列

要横向合并两个数据框,使用merge()函数,相当于inner join

total <- merge(dataframeA, dataframeB, by="ID")
将dataframeA和dataframeB按照ID进行合并
total <- merge(datagrameA, dataframeB, by=c("ID", "Country"))
 将两个数据框按照ID和Country进行合并

如果直接横向合并两个矩阵或数据框,并且不需要指定一个公共索引,那么可以直接使用cbind()函数:

total <- cbind(A, B) 横向合并对象A和对象B

(2) 添加行

要横向合并两个数据框,使用rbind()函数:

total <- rbind(dataframeA, dataframeB)

10. 数据集取子集

(1) 选入(保留)变量

newdata <- leadership[,c(6:10)]

(2) 剔除(丢弃)变量

myvars <- names(leadership) %in% c("q3", "q4")
new data <- leadership[!myvars]

(3) 选入观测

newdata <- leadership[1:3,]
new data <- leadership[which(leadership$gender == "M" & leadership$age > 30),]

attach(leadership)
new data <- leadership[which(gender==M & age > 30),]
detach(leadership)

(4) subset()函数

newdata <- subset(leadership, age>=35, | age < 24, select = c(q1, q2, q3, q4))
newdata <- subset(leadership, gender=="M" & age > 25, select=gender:q4)

(5) 随机抽样

my sample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE),]

11. 使用SQL语句操作数据框

library(sqldf)
newdf <- sqldf("select * from mtcars where carb = 1 order by mpg", row.names=TRUE)

sqldf包是R中一个实用的数据管理辅助工具。

comments powered by Disqus