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)  
})

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("Regression 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. 创建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中一个实用的数据管理辅助工具。


参考书籍《R语言实战》

原文链接:R语言学习(一)(二)(三)

推荐阅读更多精彩内容