只是自己學習時的一些筆記
R語言常用代碼整理
commannd+shift+c #批量多行注釋的快捷鍵
排序 order()函數(shù)
> b<-b[order(b$sub),] #將b數(shù)據框按照列名為sub的這一列升序排列,并重新賦值給b
#將數(shù)據框data按照性別排列猫缭,每種性別下再按照年齡升序排列。
> data1<-data[order(data$性別,data$年齡),]
> data2<-data[order(data$性別),] # 按照性別升序排列
> data3<-data[order(data$性別,-data$年齡),] #性別升序络拌,性別內年齡降序排列。
均值
mean(b$number)
計算b數(shù)據框number這一列的平均值
rowMeans(c)
計算每行的平均值
colMeans(c)
計算每列的平均值
mean_se計算得到平均值回溺,平均值+標準誤春贸,平均值-標準誤
high_ingroup<-mean_se(b[b$power==1 & b$group==1,"number"])
讀取b中 power一列等于1,并且 group一列等于1遗遵,所在的行萍恕,對應的number一列的數(shù)據。
b1<-b[b$power==1 & b$group==1,"number"]
讀取b中 power一列等于1车要,并且 group一列等于2允粤,所在的行,對應的number一列的數(shù)據。
b2<-b[b$power==1 & b$group==2,"number"]
計算b2的每一個唯一值對應的 b1數(shù)據的平均值类垫。
比如b2的唯一值總共有4個(0司光,1,2悉患,3)残家。看以下b1都有哪些行 b2等于0售躁,計算這些行b1的平均值坞淮。b2等于1,2陪捷,3同上回窘。
c<-tapply(b1,b2,mean)
用apply()函數(shù)求平均值
> x<-matrix(data=c(1,2,3,4,5,6,7,8,9,10,11,12),nrow=3)
> x
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> apply(x,1,mean) #求每行的平均值
[1] 5.5 6.5 7.5
> apply(x,2,mean) #求每列的平均值
[1] 2 5 8 11
rbind 將矩陣 縱向 合并在一起。
也就是市袖,high_ingroup和high_outgroup等都有相同的列啡直,按照 縱向的方式拼接在一起。
rbind(high_ingroup,high_outgroup,high_unclass,low_ingroup,low_outgroup,low_unclass)
與rbind對應的是 cbind苍碟,將矩陣橫向合并在一起
library(dplyr) # 載入包dplyr付枫,方便下一步用 此包里的rename函數(shù)給數(shù)據框的列重新命名
將y重命名為mean_number;將ymin重命名為min_number驰怎;將ymax重命名為max_number
df1<-rename(df1, mean_number=y, min_number=ymin,max_number=ymax)
還可以用names()函數(shù)來重命名。不需要額外載入包二打。
> names(data)
[1] "condition" "power" "membership" "序號" "實驗編號"
[6] "性別" "年齡" "職業(yè)" "權力主觀評定" "情景想象程度"
[11] "懲罰Q1_情景1" "懲罰Q2_情景1" "懲量Q3_情景1" "懲罰Q4_情景1" "懲罰Q5_情景1"
[16] "懲罰Q6_情景1" "懲罰平均得分_情景1" "懲罰平均得分2_情景1" "懲罰平均得分3_情景1" "懲罰Q1_情景2"
[21] "懲罰Q2_情景2" "懲量Q3_情景2" "懲罰Q4_情景2" "懲罰Q5_情景2" "懲罰Q6_情景2"
[26] "懲罰平均得分_情景2" "報復性懲罰Q1" "報復性懲罰Q2" "報復性懲罰" "期待滿足性懲罰"
[31] "威懾動機Q1" "威懾動機Q2" "威懾動機Q3" "威懾動機" "剝奪動機"
[36] "改善違規(guī)者未來行為" "mean_puni_s1" "cat"
> names(data)[5]<-"subID" # 將實驗編號 重命名為 subID
> mydata<-data.frame(a=matrix(data=c(1,2,3,4,5,6,7,8,9,0),nrow=5,ncol=2))
> mydata
a.1 a.2
1 1 6
2 2 7
3 3 8
4 4 9
5 5 0
> mydata1<-data.frame(a=matrix(data=c(1,2,3,4,5,6,7,8,9,0,3,2),nrow=4,ncol=3))
> mydata1
a.1 a.2 a.3
1 1 5 9
2 2 6 0
3 3 7 3
4 4 8 2
# 要合并mydata和mydata1县忌,但是兩個數(shù)據,變量個數(shù)不同继效,所以要給mydata添加一列症杏。
> mydata2<-transform(mydata, a.4=NA)
> mydata2
a.1 a.2 a.4
1 1 6 NA
2 2 7 NA
3 3 8 NA
4 4 9 NA
5 5 0 NA
# 由于添加的變量名稱a.4和mydata1里的a.3不同,所以合并時報錯
> mydata_new=rbind(mydata1,mydata2)
Error in match.names(clabs, names(xi)) :
names do not match previous names
> names(mydata2)
[1] "a.1" "a.2" "a.4"
# 重命名a.4為a.3
> names(mydata2)[3]<-"a.3"
> names(mydata2)
[1] "a.1" "a.2" "a.3"
# 合并兩個數(shù)據集
> mydata_new=rbind(mydata1,mydata2)
> mydata_new
a.1 a.2 a.3
1 1 5 9
2 2 6 0
3 3 7 3
4 4 8 2
5 1 6 NA
6 2 7 NA
7 3 8 NA
8 4 9 NA
9 5 0 NA
position=position_jitterdodge() 實現(xiàn)數(shù)據并列抖動功能瑞信。當數(shù)據大都是同一個值時厉颤,會重疊在一起,可以用這個功能凡简。
用法:
position_jitterdodge(jitter.width = NULL, jitter.height = 0, dodge.width = 0.75, seed = NA)
用于箱線圖或條形圖和點圖在一起的情形,且有順序的逼友,必須箱子或條形在前,點圖在后秤涩,抖動只能用在散點幾何對象中,
jitter.width 默認40%, jitter.height
默認0, dodge.width = 0.75
點分布于各組箱子(或條形)75%寬度上帜乞,默認點水平抖動錯開
也可以考慮使用 position="jitter"
,等價于position=position_jitter()
這個是擾動,默認抖動50%。
可以自己自定義擾動的參數(shù):
geom_point(position = position_jitter(width = 0.1, height = 0.1))
意思是:增加水平抖動10%筐眷,垂直抖動10%黎烈,但是抖動是隨機的,每次結果都可能不一樣。
position=position_jitterdodge()
position="jitterdodge"
縱向橫向同時分割
p + facet_grid(drv ~ cyl)
當只想單獨指定行分面或列分面時照棋,沒有指定分面變量的參數(shù)需要用'.'代替
縱向分割
p + facet_grid(drv ~ .)
橫向分割
p + facet_grid(. ~ cyl)
數(shù)據類型轉換
as.numeric(a)
將a轉化為num類型的數(shù)據
a[,-1]
去掉數(shù)據a第一列的數(shù)據
mydata <- transform(mydata, sumx = x1 + x2, meanx = (x1 + x2)/2)
將計算mydata中资溃,x1和x2兩列的和和平均值,并添加到數(shù)據框mydata中烈炭。
# 將data數(shù)據框情景想象程度一列溶锭,數(shù)值大于6的數(shù)據 記為 higher,
# 并新增一列cat梳庆,將數(shù)據存儲在cat一列。
data$cat[data$情景想象程度>6]<-"higher"
View(data)
data$cat[data$情景想象程度<4]<-"higher"
data$cat[data$情景想象程度<4]<-"middle"
data$cat[data$情景想象程度>=4&data$情景想象程度<=6]<-"lower"
#等價于下面的代碼
data2<-within(data2,{
+ cat<-NA
+ cat[情景想象程度>6] <-"higher"
+ cat[情景想象程度<4] <-"lower"
+ cat[情景想象程度>=4&情景想象程度<=6] <-"middle"
+ })
View(data2)
rm(data5,data6,data7,a,b,data3) #rm()刪除特定變量膏执,如果有多個變量,用逗號分隔
缺失值識別
在R中,缺失值以符號NA(not available)表示。
函數(shù)is.na()可以用來檢測缺失值是否存在蛉加。它會返回一個與數(shù)據大小相同的邏輯對象针饥,如果某個元素是缺失值厂抽,就返回TURE,否則就返回FALSE丁眼。
無限的值(正無窮和負無窮)分別用Inf和-Inf來表示筷凤。用is.infinite()來檢測。
不可能出現(xiàn)的值用NaN(not a number)來表示苞七。用is.nan()來檢測藐守。
要注意NA NaN Inf三者的區(qū)別。
> a<-is.na(data[,5:7])
subID 性別 年齡
[1,] TRUE FALSE FALSE
[2,] TRUE FALSE FALSE
[3,] TRUE FALSE FALSE
[4,] TRUE FALSE FALSE
[5,] TRUE FALSE FALSE
[6,] TRUE FALSE FALSE
> str(a)
logi [1:174, 1:3] TRUE TRUE TRUE TRUE TRUE TRUE ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:3] "subID" "性別" "年齡"
> dim(a)
[1] 174 3
> class(a)
[1] "matrix" "array"
> mode(a)
[1] "logical"
統(tǒng)計分析時蹂风,不考慮缺失值NA吗伤。
可以使用na.rm=TRUE
不把缺失值納入統(tǒng)計。
可以使用na.omit()
刪除所有含缺失值數(shù)據的行硫眨。
> sum(data$subID) #因為subID一列包含缺失值足淆,所以返回值是NA
[1] NA
> sum(data$subID, na.rm=TRUE)#na.rm=TRUE不把缺失值納入統(tǒng)計
[1] 5108
> data_new<-na.omit(data) #刪除data中含有缺失值NA數(shù)據的行巢块。
> data
condition power membership 序號 subID 性別 年齡 職業(yè) 權力主觀評定 情景想象程度 懲罰Q1_情景1 懲罰Q2_情景1 懲量Q3_情景1
1 11 1 1 1 NA 2 19 1 5 5 7 7 6
2 11 1 1 2 NA 2 18 1 7 7 7 7 7
3 11 1 1 3 NA 2 20 1 7 6 6 6 6
4 11 1 1 4 NA 2 18 1 7 5 6 6 6
5 11 1 1 6 NA 2 18 1 7 7 7 7 7
> data_new
condition power membership 序號 subID 性別 年齡 職業(yè) 權力主觀評定 情景想象程度 懲罰Q1_情景1 懲罰Q2_情景1 懲量Q3_情景1
34 11 1 1 1 101 2 22 1 7 4 7 7 7
35 11 1 1 2 103 2 22 1 7 5 6 6 6
36 11 1 1 3 107 1 26 1 7 4 6 6 6
37 11 1 1 4 109 2 23 1 6 6 6 6 6
72 12 1 2 1 999 2 26 1 7 7 7 7 7
顯示時間和日期
> date() #顯示當前的時間和日期
[1] "Thu Feb 25 11:58:27 2021"
> Sys.Date() #顯示當前的日期
[1] "2021-02-25"
citation() # 輸出R的引用 參考文獻
citation(“l(fā)me4”) #輸出lme4這個包的引用 參考文獻
批量更改數(shù)據類型為factor
提取特定行/列的數(shù)據
leadership[ , c(6:10)]
#這里代表leadership的所有行,6到10列的數(shù)據巧号。
需要注意的是族奢,在R里面,用留空代表所有行丹鸿,這個是跟matlab不一樣的地方越走。
另一種方法是:
> a<-c(1:8)
> b<-c(3:10)
> c<-paste("c",1:8,sep="")
> e<-data.frame(a,b,c)
> e
a b c
1 1 3 c1
2 2 4 c2
3 3 5 c3
4 4 6 c4
5 5 7 c5
6 6 8 c6
7 7 9 c7
8 8 10 c8
# 使用subset()函數(shù),提取a列大于3同時b列小于8的行靠欢,c列的數(shù)據
> f<-subset(e,e$a>3 & e$b<8,select=c)
> f
c
4 c4
5 c5
刪除特定列的數(shù)據
# %in%含義是:
# 看names(leadership)的元素是否包含在c("q3", "q4”)中廊敌,返回邏輯值TRUE 或者 FALSE
myvars <- names(leadership) %in% c("q3", "q4")
newdata <- leadership[!myvars]
# 上述代碼的含義是:首先leadership中變量名為q3和q4的列會返回TRUE,
# 下一步门怪,通過!myvars選擇除了q3和q4之外的列骡澈,賦值給新的變量newdata。
# 這樣就間接達到了刪除q3和q4列的目的掷空。
# 另一種方法
newdata <- leadership[c(-8,-9)] #前面加負號就代表刪除這一列肋殴。
# 第三種方法
# 將q3和q4設置為NULL,達到的目的是一樣的坦弟,就是把q3和q4兩列刪除
leadership$q3 <- leadership$q4 <- NULL
用sample()函數(shù)隨機抽取數(shù)據
> nrow(e)
[1] 8
# 1:nrow(e)代表1到8护锤,3代表從1到8中隨機抽取3個數(shù),replace=FALSE代表無放回的抽取
# e[sample(1:nrow(e),3,replace=FALSE), ]代表選取 e中酿傍,生成的行里面所有列的數(shù)據烙懦。
> e[sample(1:nrow(e),3,replace=FALSE), ]
a b c
6 6 8 c6
7 7 9 c7
8 8 10 c8
> e[sample(1:nrow(e),3,replace=FALSE), ]
a b c
6 6 8 c6
1 1 3 c1
8 8 10 c8
> e[sample(1:nrow(e),3,replace=FALSE), ]
a b c
7 7 9 c7
4 4 6 c4
2 2 4 c2
R中常用的數(shù)值和字符處理函數(shù)
當這些函數(shù)被應用于數(shù)值向量,矩陣或者數(shù)據框時赤炒,他們會作用于每一個獨立的值氯析。例如:下面的例子,是對向量中的每一個數(shù)值都求平方可霎。
> a<-c(3.5,2.5,1.5,0.5,1.5,2.5,3.5)^2
> a
[1] 12.25 6.25 2.25 0.25 2.25 6.25 12.25
用scale()函數(shù)進行數(shù)據的標準化
> mydata<-read.csv(file.choose()) #手動選取文件讀入數(shù)據
> str(mydata) #查看數(shù)據結構
'data.frame': 84 obs. of 5 variables:
$ subject : chr "F1" "F1" "F1" "F1" ...
$ gender : chr "F" "F" "F" "F" ...
$ scenario : int 1 1 2 2 3 3 4 4 5 5 ...
$ attitude : chr "pol" "inf" "pol" "inf" ...
$ frequency: num 213 204 285 260 204 ...
> head(mydata) #查看數(shù)據前6列
subject gender scenario attitude frequency
1 F1 F 1 pol 213.3
2 F1 F 1 inf 204.5
3 F1 F 2 pol 285.1
4 F1 F 2 inf 259.7
5 F1 F 3 pol 203.9
6 F1 F 3 inf 286.9
# 提取scenario和frequency兩列的的數(shù)據,賦值給mydata1
> mydata1<-mydata[,names(mydata) %in% c("scenario","frequency")]
> head(mydata1) #查看mydata1的前6列
scenario frequency
1 1 213.3
2 1 204.5
3 2 285.1
4 2 259.7
5 3 203.9
6 3 286.9
> mydata2<-scale(mydata1) #對mydata1的所有列分別進行標準化宴杀,使其成為平均數(shù)為0癣朗,標準差為1的數(shù)據。
> head(mydata2)
scenario frequency
[1,] -1.4910447 0.3008524
[2,] -1.4910447 0.1665847
[3,] -0.9940298 1.3963552
[4,] -0.9940298 1.0088097
[5,] -0.4970149 0.1574300
[6,] -0.4970149 1.4238191
> mean1<-mean(mydata1$scenario) #計算scenario一列的平均值
> s1<-sd(mydata1$scenario) #計算scenario一列的標準差
> mean1
[1] 4
> s1
[1] 2.012012
# 手動標準化
> standard_scenario<-(mydata1$scenario-mean1)/s1
> standard_scenario
[1] -1.4910447 -1.4910447 -0.9940298 -0.9940298 -0.4970149 -0.4970149 0.0000000 0.0000000 0.4970149 0.4970149
[11] 0.9940298 0.9940298 1.4910447 1.4910447 -1.4910447 -1.4910447 -0.9940298 -0.9940298 -0.4970149 -0.4970149
[21] 0.0000000 0.0000000 0.4970149 0.4970149 0.9940298 0.9940298 1.4910447 1.4910447 -1.4910447 -1.4910447
[31] -0.9940298 -0.9940298 -0.4970149 -0.4970149 0.0000000 0.0000000 0.4970149 0.4970149 0.9940298 0.9940298
[41] 1.4910447 1.4910447 -1.4910447 -1.4910447 -0.9940298 -0.9940298 -0.4970149 -0.4970149 0.0000000 0.0000000
[51] 0.4970149 0.4970149 0.9940298 0.9940298 1.4910447 1.4910447 -1.4910447 -1.4910447 -0.9940298 -0.9940298
[61] -0.4970149 -0.4970149 0.0000000 0.0000000 0.4970149 0.4970149 0.9940298 0.9940298 1.4910447 1.4910447
[71] -1.4910447 -1.4910447 -0.9940298 -0.9940298 -0.4970149 -0.4970149 0.0000000 0.0000000 0.4970149 0.4970149
[81] 0.9940298 0.9940298 1.4910447 1.4910447
> mydata2<-cbind(mydata2,standard_scenario) #將手動標準化的結果與mydata2合并
> head(mydata2) #查看結果旺罢,發(fā)現(xiàn)旷余,scenario和standard_scenario相等。
scenario frequency standard_scenario
[1,] -1.4910447 0.3008524 -1.4910447
[2,] -1.4910447 0.1665847 -1.4910447
[3,] -0.9940298 1.3963552 -0.9940298
[4,] -0.9940298 1.0088097 -0.9940298
[5,] -0.4970149 0.1574300 -0.4970149
[6,] -0.4970149 1.4238191 -0.4970149
# 對特定列scenario進行標準差為5扁达,平均值為20的標準化正卧,標準化后的結果賦值給變量standard_scenario2,并加入到mydata中生成新的一列跪解,最后賦值給mydata3
> mydata3<-transform(mydata,standard_scenario2=scale(scenario)*5+20)
> head(mydata3)
subject gender scenario attitude frequency standard_scenario2
1 F1 F 1 pol 213.3 12.54478
2 F1 F 1 inf 204.5 12.54478
3 F1 F 2 pol 285.1 15.02985
4 F1 F 2 inf 259.7 15.02985
5 F1 F 3 pol 203.9 17.51493
6 F1 F 3 inf 286.9 17.51493
> mean(mydata3$standard_scenario2) #計算平均值炉旷,發(fā)現(xiàn)確實是20
[1] 20
> sd(mydata3$standard_scenario2)#計算標準差,發(fā)現(xiàn)確實是5
[1] 5
概率函數(shù)
set.sed()
指定種子,可以讓結果重現(xiàn)窘行。set.seed()括號里面的參數(shù)可以是任意數(shù)字饥追,是代表你設置的第幾號種子而已,不會參與運算罐盔,是個標記而已但绕。
#將ToothGrowth_new數(shù)據框中的supp列,等于OJ的數(shù)據替換為WJ
#因為supp是factor惶看,所以要先變成character 不然會報錯
> ToothGrowth_new$supp<-as.character(ToothGrowth_new$supp)
> ToothGrowth_new$supp[which(ToothGrowth_new$supp=="OJ")] <-"WJ"
#通過aggregate函數(shù)捏顺,計算ToothGrowth$supp這一列,不同因子水平上 len這一列的平均值纬黎。
> aggregate(ToothGrowth$len,by=list(ToothGrowth$supp),FUN=mean)
Group.1 x
1 OJ 20.663
2 VC 16.963
#通過str()函數(shù) 或者as.numeric()函數(shù)可以查看 不同標簽對應的數(shù)字是多少
as.numeric(ToothGrowth$supp,lable=c("OJ","VC"))
百分號的寫法
> a<-percent(c(0,1))
> a
[1] "0%" "100%"
> str(a)
chr [1:2] "0%" "100%"
查看轉義字符的使用方法
?Quotes
用sapply()函數(shù)提取列表的某一行的某一列
# "[" 是一個可以提取某個對象的一部分的函數(shù)幅骄。在這里是用來提取列表y個成分中的第一個和第二個元素的。
> sapply(y,"[",2) #提取y中的每一行的第二列的數(shù)據
[1] "Davis" "Williams" "Moose" "Jones"
[5] "Markhammer" "Cushing" "Ytzrhak" "Knox"
[9] "England" "Rayburn"
> sapply(y,"[",1) #提取y中的每一行的第一列的數(shù)據
[1] "John" "Angela" "Bullwinkle" "David"
[5] "Janice" "Cheryl" "Reuven" "Greg"
[9] "Joel" "Mary"
使用strsplit()函數(shù)將元素拆分 應用到字符串組成的向量上會返回一個列表
# 這里是用空格符號將Student數(shù)據里的 姓氏和姓名分開
> y <- strsplit(roster$Student, " ")
> y
[[1]]
[1] "John" "Davis"
[[2]]
[1] "Angela" "Williams"
[[3]]
[1] "Bullwinkle" "Moose"
[[4]]
[1] "David" "Jones"
[[5]]
[1] "Janice" "Markhammer"
[[6]]
[1] "Cheryl" "Cushing"
[[7]]
[1] "Reuven" "Ytzrhak"
[[8]]
[1] "Greg" "Knox"
[[9]]
[1] "Joel" "England"
[[10]]
[1] "Mary" "Rayburn"
quantile()函數(shù)計算百分位
# 這里是計算score 的0.8 0.6 0.4和0.2百分位莹桅。
> y <- quantile(roster$score, c(.8,.6,.4,.2))
> y
80% 60% 40% 20%
0.74 0.44 -0.36 -0.89
apply() lapply() sapply()
apply() 可以把函數(shù)應用到數(shù)組的某個維度上;
lapply() sapply()可以把函數(shù)應用到列表上昌执。
cut()可以把連續(xù)變量x分割為有著n個水平的因子
> age1<-cut(bc$age,breaks = 3,labels = c(1,2,3))#平均分為3個區(qū)間,命名為1诈泼,2懂拾,3
> age2<-cut(bc$age,breaks=c(0,20,60,100),include.lowest=T,
labels = c(1,2,3))
#把age劃分為0-20,20-60铐达,60到100這樣3個區(qū)間
> dd<-cbind(bc,age2) #把變量加入表格
> x<-cut(c(1,2,3,4,5,6,7,8,9), 3,labels=c(1,2,3))
> x
[1] 1 1 1 2 2 2 3 3 3
Levels: 1 2 3
循環(huán) 和 條件執(zhí)行
for循環(huán)
for循環(huán) 重復執(zhí)行一個語句岖赋,直到某個變量的值不再包含在序列seq中為止。
for (var in seq) statement
for (i in 1:10)
{
print("Hello")
}
while循環(huán)
while循環(huán)重復地執(zhí)行一個語句瓮孙,直到條件不為真為止唐断。
while (cond) statement
i <- 10
while (i > 0)
{
print("Hello");
i <- i - 1
}
if-else
if (cond) statement
if 在某個給定條件為真時執(zhí)行語句。
if (cond) statement1 else statement2
if-else 在某個給定條件為真時執(zhí)行語句杭抠,為假時執(zhí)行另外的語句脸甘。
if (is.character(grade))
grade <- as.factor(grade)
if (!is.factor(grade))
grade <- as.factor(grade)
else
print("Grade already is a factor")
ifelse
ifelse(cond, statement1, statement2)
若cond為TRUE,則執(zhí)行第一個語句statement1偏灿;若cond為FALSE丹诀,則執(zhí)行第二個語句statement2。
ifelse(score > 0.5, print("Passed"), print("Failed"))
outcome <- ifelse (score > 0.5, "Passed", "Failed")
switch
switch(expr, ...)
switch根據一個表達式的值選擇語句執(zhí)行翁垂。
feelings <- c("sad", "afraid")
for (i in feelings)
print(
switch(i,
happy = "I am glad you are happy",
afraid = "There is nothing to fear",
sad = “cheer up”,
angry = "Calm down now" )
# 含義是铆遭,i等于sad時,print(也就是輸出)cheer up
# i等于afraid時沿猜,print(也就是輸出)There is nothing to fear
)
用戶自編函數(shù)
轉置 t()
函數(shù)t()對一個矩陣或者數(shù)據框進行轉置