R語言學習筆記
數(shù)據(jù)導入
寫法1:“文件名稱”,如果不寫路徑,是會在當前路徑下讀取,可用getwd()獲取當前路徑??捎胹etwd(“路徑”)修改當前路徑。
寫法2:絕對路徑\文件名稱,比如“D: \…\test.xlsx”。
寫法2:“clipboard”,利用復制,然后讀取? 【x <- import("clipboard", header = T)】
#讀取txt數(shù)據(jù)
read.table("file.txt",?header=T)? #導入txt文本文件
#讀取excel數(shù)據(jù)
library(readxl)? #加載程序包,讀取.xlsx數(shù)據(jù)
cjb <- read_excel("E:/R語言/R語言學習/data/cjb.xlsx") #讀取數(shù)據(jù)
#讀取.csv數(shù)據(jù)
df <- read.csv("產(chǎn)品銷售記錄表.csv",header=,row.name=,clo.name=,skip=)
header:是否使用數(shù)據(jù)文件的第一行作為列名
row.name:指定行名稱,可設置為FALSE
clo.name:指定列名稱,可設置為FALSE
skip:很多時候數(shù)據(jù)較為復雜是,可以指定是否跳過文件的前幾行讀取。
數(shù)據(jù)基本處理
is.na-判斷空值? ? ? ?is.na(x)? x:向量??
test =c('Hello', 'World',NA, 1,? 2, 3)?
is.na(test)
test[! is.na(test)] #去除test中NA值
union-計算并集? ? ?union(x,y)? ? ?x, y:向量
union(1:4,2:5)#示例
union(1:4,8:10)? ?# union只可以處理倆個向量,那如何計算多個向量的并集呢
union(1:4,union(2:5,8:10))? ?# 這個例子是想強調(diào):函數(shù)是可以疊加的,不同函數(shù)之間也是如此
intersect-計算交集? ? ? intersect(x,y)? ? ?x, y:向量
intersect(1:4,2:5)?
intersect(1:4,union(2:5,8:10))? ?#ips:先求并集,再求交集
setdiff-獲取左向量的特有元素? ? ?setdiff(x,y)? ?x, y:向量
setdiff(1:4,2:5)? ? ?結(jié)果 1
seq-生成數(shù)值型向量? ?seq(from,to,by=,length.out=)
from:起始數(shù)值? ? to:終止數(shù)值? ? ? by:序列間隔,默認為1? ?? length.out:將from-to區(qū)間劃分為多少份,可簡化為len
seq(1,9,by=3) # 生成1到9,以3為間隔的序列
seq(1,9,len=4) #將1到9的序列,劃分為4等份
sample-隨機抽取向量? ? sample(x,size,replace=FALSE)
x:待隨機抽取的向量 size:抽取的次數(shù),默認抽取length(x)次? replace:是否重復抽樣
sample(1:10,5,rep=T) # 從1:10序列中隨機放回抽取5次
?注意:? ? ? ??隨機抽取意味著運行兩次sample(1:10,5)得到的結(jié)果不一樣
? ? ? ? ? ? ? ? ? ?set.seed()可以重復隨機結(jié)果
? ? ? ? ? ? ? ? ? ?set.seed(1234) #括號里面的參數(shù)可以是任意數(shù)字,代表你設置的第幾號種子,不參與運算,是個標記。
? ? ? ? ? ? ? ? ? ?sample(1:10,5,rep=T)#重復兩次結(jié)果一樣
rep-重復向量? ? ?? rep(x,each,times)? ?
x:待重復的向量? ? each:每一個元素重復的次數(shù)? ? times:向量整體重復次數(shù)
rep(c(1,? 2, 3),2) # 向量整體重復2次
rep(c(1,? 2, 3),each=2) # 向量的每一個元素依次重復2次
rep(c(1,? 2, 3),1:3) # 向量的每一個元素重復不同次數(shù)?
rep(c(1,? 2, 3),each=2, times=3) #向量每一個元素重復2次,總共重復3次
rev-反向排列向量? ?rev(x)? ? ?x:待反向排列的向量
rev(1:4)? #結(jié)果4321
table-頻次統(tǒng)計? ? ?table(x)? ? x:待統(tǒng)計向量
table(c(1,2,2,4,7,1,1))? ? #結(jié)果?

sort-元素重排? ? ? sort(x, decreasing=FALSE)? ??
x: 待重排向量? ?decreasing: 降序排列,默認FALSE
order-求元素順序? ? ?order(x, decreasing=FALSE)? ??
x: 待排序向量? ? decreasing: 降序排列,默認FALSE)
order(c('b','e','a')) # 返回排序的坐標值? ? 結(jié)果 3 1 2
rank-求元素排名? ? ?rank(x)? ? x: 待求排名的向量
rank(c('b','e','a')) # 返回元素的排名? 結(jié)果 2 3 1
tolower/?toupper字符串小/大寫轉(zhuǎn)換? ? ?tolower(x) /toupper(x)? ? x: 待轉(zhuǎn)換字符串或字符串向量
sub-字符串替換? ?sub(pattern, replacement, x)? ?
pattern:待替換原始字符串模式? ?replacement:待替換目標字符串? ? x: 待轉(zhuǎn)換字符串或字符串向量
sub("a","A",c("abcda","adcba")) #只替換每次字符串的第1個匹配
gsub("a","A",c("abcda","adcba")) #替換所有匹配
sub('a$', 'A', c("abcda","adcba")) #只替換位于末尾的a
sub('b.*a','Box', c("abcda","adcba")) # 替換從b到a的字符
sub('b.','Box', c("abcda","adcba"))? # 替換b和其后一位的字符
sub('b.+','Box', c("abcda","adcba")) # 替換從b之后的所有字符
sub('l.*l','AAAA','Hello World') #貪婪匹配:匹配盡可能多的字符
sub('l.*?l','AAAA','Hello World') #懶惰匹配:匹配最短的字串
substr 字符串截取? substr(x, start, stop)? ??
x:待截取字符串或字符串向量? ? start:起始位置? ? stop:終止位置
substr('Hello World', 1, 4)#截取第一到第四個位置上的字符
strsplit? 字符串切割 strsplit(x, split)? ? x:待切割字符串或字符串向量? ? split:分隔符
strsplit("Hello World", ' ')? ? ? ? ? ? ? ? ?#? 返回列表形式??
unlist(strsplit('Hello World', ' '))? ?#Tips: strsplit返回結(jié)果形式為列表,可以通過unlist函數(shù)將列表轉(zhuǎn)化為向量
paste-字符串連接? paste(…,sep="",collapse=NULL)??
...:一個或多個R對象? sep:元素分隔符? collapse:字符串分隔符
paste('Hello','World',sep=', ')? ? ? #結(jié)果"Hello, World"
paste('Hello','World',1, 2, 3,sep='_!_ ')? ? ? ?#結(jié)果"Hello_!_ World_!_ 1_!_ 2_!_ 3"
paste(c('Hello','World'),c(1, 2, 3),sep=', ')? ? ? ?#結(jié)果?"Hello, 1" "World, 2" "Hello, 3"
paste(c('Hello','World'),c(1, 2, 3),sep=', ',collapse = '; ')? ? ? #結(jié)果?"Hello, 1; World, 2; Hello, 3"
match-整詞匹配? ? match(x,table)? ? x:待查詢值? ? table:匹配模板
match(c('Hi', 'Wor', 2, 1, 3),c('Hello', 'World', 1, 2, 3))? ? ?#結(jié)果?NA NA? 4? 3? 5
#Tips: match返回值為table中匹配x值的位置,沒有匹配上返回NA; %in% 類似match,但是返回值為邏輯值
c('Hi', 'Wor',? 2, 1, 3) %in% c('Hello', 'World', 1, 2, 3)? ? ?#結(jié)果FALSE FALSE? TRUE? TRUE? TRUE
grep關(guān)鍵字搜索? ?grep(pattern, x)? ?pattern:待搜索字符串模式? ? x: 待搜索字符串或字符串向量
grep('o',c('Hello', 'World', 1,? 2, 3))? ? ?# 返回匹配上的位置? ? ?結(jié)果? ?1 2
grepl('o',c('Hello', 'World', 1,? 2, 3))? ? # 返回邏輯值? ? ? ?結(jié)果? TRUE? TRUE FALSE FALSE FALSE
?Tips: match為整詞匹配,grep為關(guān)鍵字匹配;match第一個參數(shù)可以是向量,grep第一個參數(shù)只能是字符;match不能使用正則,grep可以使用正則
na.omit? 刪除含有空值的行? ?na.omit(df)? ? df:數(shù)據(jù)框
apply? 數(shù)據(jù)框循環(huán)? ?apply相比較for循環(huán),可以提高運算效率
apply(X, MARGIN, FUN...)? ? X:數(shù)組、矩陣、數(shù)據(jù)框? ? MARGIN:1表示按行,2表示按列? ? FUN:調(diào)用函數(shù)
head(airquality)? ?#? airquality是R內(nèi)置的示例數(shù)據(jù)集
apply(head(airquality), 1, mean)? ? #按行計算均值
subset-數(shù)據(jù)框截取? subset可以根據(jù)自定義條件截取數(shù)據(jù)框子集? ?subset(x,...,select)?
? x: 數(shù)據(jù)框? ? ...: 條件選擇,主要針對行操作? select: 條件選擇,主要針對列操作
head(airquality)? ?? # airquality是R內(nèi)置的示例數(shù)據(jù)集
head(subset(airquality,Temp > 80, select = c(Ozone,Temp)))? ? #選擇 Temp>80的行,并且只展示Ozone和Temp列
head(subset(airquality, Day == 1, select = -Temp))? ? ?? #選擇Day=1的行,并且刪除Temp列
split-數(shù)據(jù)框拆分? ? split可以根據(jù)某一列(因子型)將數(shù)據(jù)框拆分為不同子集
split(x, f)? ? x: 數(shù)據(jù)框? ? f: 因子型列表
head(iris) # iris為R內(nèi)置數(shù)據(jù)集
class(iris$Species)? ? ?#? ? ? ?查看數(shù)據(jù)類型? ? ? ? ? ? Species列為因子型
levels(iris$Species)? ? # 查看Species的類別
split(iris,iris$Species)??#? iris數(shù)據(jù)框集按species拆分? ?
class(split(iris,iris$Species))? ?#?拆分后的數(shù)據(jù)類型為列表
names(split(iris,iris$Species)) # 拆分后的列表名稱
head(split(iris,iris$Species)[['versicolor']]) # 查看拆分后的versicolor子集
merge-數(shù)據(jù)框合并? ?merge可以根據(jù)列名合并兩個不同的數(shù)據(jù)框??
merge(x, y, by = intersect(names(x), names(y)),? by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all)? ?
x,y 要合并的兩個數(shù)據(jù)集
by,用于連接兩個數(shù)據(jù)集的列,intersect(a,b)值向量a,b的交集,names(x)指提取數(shù)據(jù)集x的列名?
by = intersect(names(x), names(y)) 是獲取數(shù)據(jù)集x,y的列名后,提取其公共列名,作為兩個數(shù)據(jù)集的連接列, 當有多個公共列時,需用下標指出公共列,如names(x)[1],指定x數(shù)據(jù)集的第1列作為公共列?
也可以直接寫為 by = ‘公共列名’ ,前提是兩個數(shù)據(jù)集中都有該列名,并且大小寫完全一致,R語言區(qū)分大小寫
by.x,by.y:指定依據(jù)哪些行合并數(shù)據(jù)框,默認值為相同列名的列? ?默認根據(jù)數(shù)據(jù)框列名自行判斷
all,all.x,all.y:指定x和y的行是否應該全在輸出文件? ?默認僅輸出非空行
sort:by指定的列(即公共列)是否要排序
suffixes:指定除by外相同列名的后綴
incomparables:指定by中哪些單元不進行合并
df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)), Taste=c(rep("Sweet", 3), rep("bitter", 3))); df1
df2 = data.frame(CustomerId = c(2, 4, 7), State = c(rep("Alabama", 2), rep("Ohio", 1)), Flavour=c(rep("Sweet", 3), rep("bitter", 3))); df2
df3 = data.frame(CustomerId = c(1, 4, 7), Product = c("Toaster","Alabama", "Ohio")); df3
merge(x=df1, y=df2)? ?#默認根據(jù) df1 、df2相同列 CustomerID進行合并
merge(x=df1, y=df3)? #默認根據(jù) df1、 df3相同列 CustomerID、Product進行合并
merge(df1, df3, by="CustomerId")? #指定根據(jù)df1、df3相同列CustomerID進行合并
head(merge(df1, df2, by.x="Taste", by.y="Flavour")) #指定根據(jù)df1的Taste列、df2的Flavour列進行合并
merge(x=df1, y=df3, by="CustomerId", all=T) #指定根據(jù)df1、df3相同列CustomerID進行合并,輸出所有內(nèi)容
merge(x=df1, y=df3, by="CustomerId", all.x =T) #指定根據(jù)df1、df3相同列CustomerID進行合并,輸出df1所有內(nèi)容
merge(x=df1, y=df3, by="CustomerId", all.y = T) #指定根據(jù)df1、df3相同列CustomerID進行合并,輸出df3所有內(nèi)容
#Tips:
#is.na也可以判斷數(shù)據(jù)框空值
is.na(merge(x=df1, y=df3, by="CustomerId", all.y = T))
#complete.cases可以判斷數(shù)據(jù)框某一列是否全部為非空值
complete.cases(merge(x=df1, y=df3, by="CustomerId", all.y = T))
# na.omit可以刪除空行
na.omit(merge(x=df1, y=df3, by="CustomerId", all.y = T))
aggregate(x, by, FUN, ..., simplify = TRUE, drop = TRUE)
aggregate函數(shù)應該是數(shù)據(jù)處理中常用到的函數(shù),簡單說有點類似sql語言中的group by,可以按照要求把數(shù)據(jù)打組聚合,然后對聚合以后的數(shù)據(jù)進行加和、求平均等各種操作。
#我們常用到的參數(shù)是:x, by, FUN。 x, 你想要計算的屬性或者列。 by, 是一個list,可以指定一個或者多個列作為分組的基礎(chǔ)。 FUN, 指定一個函數(shù),用來計算,可以作用在所有分組的數(shù)據(jù)上面。