數(shù)據(jù)準(zhǔn)備
df <- read.table(file = "D:/Documents/R wd/df.csv", header = T, sep = ",", colClasses = c(year = "character", nitrogen = "character", variety = "character", block = "character")) # 數(shù)據(jù)導(dǎo)入葛峻。
df # 查看數(shù)據(jù)架馋。
## year nitrogen variety block v1 v2 v3 v4
## 1 2020 N1 a 1 1.26 2.14 3.4 4.66
## 2 2020 N1 a 2 1.20 2.90 4.1 5.30
## 3 2020 N1 a 3 1.30 3.00 4.3 5.60
## 4 2020 N1 b 1 1.08 1.72 2.8 3.88
## 5 2020 N1 b 2 1.05 1.65 2.7 3.75
## 6 2020 N1 b 3 1.15 1.35 2.5 3.65
## 7 2020 N2 a 1 1.32 3.78 5.1 6.42
## 8 2020 N2 a 2 1.28 4.32 5.6 6.88
## 9 2020 N2 a 3 1.35 3.95 5.3 6.65
## 10 2020 N2 b 1 1.33 3.47 4.8 6.13
## 11 2020 N2 b 2 1.28 2.72 4.0 5.28
## 12 2020 N2 b 3 1.30 3.90 5.2 6.50
## 13 2021 N1 a 1 1.19 3.61 4.8 5.99
## 14 2021 N1 a 2 1.21 3.29 4.5 5.71
## 15 2021 N1 a 3 1.24 3.26 4.5 5.74
## 16 2021 N1 b 1 1.09 2.71 3.8 4.89
## 17 2021 N1 b 2 1.28 2.32 3.6 4.88
## 18 2021 N1 b 3 1.35 1.95 3.3 4.65
## 19 2021 N2 a 1 1.45 4.35 5.8 7.25
## 20 2021 N2 a 2 1.40 3.80 5.2 6.60
## 21 2021 N2 a 3 1.37 4.23 5.6 6.97
## 22 2021 N2 b 1 1.28 2.72 4.0 5.28
## 23 2021 N2 b 2 1.15 3.35 4.5 5.65
## 24 2021 N2 b 3 1.24 3.46 4.7 5.94
5.5 用戶自編函數(shù)
R的最大優(yōu)點之一就是用戶可以自行添加函數(shù)法希。
myfunction <- function(arg1, arg2, ... ){ statements return(object) }
myfunction是自定義函數(shù)的名稱雪标,arg1耀鸦,arg2為參數(shù)橘忱,statements為函數(shù)語句实幕,用于定義函數(shù)的作用,return(object)返回結(jié)果睬塌。
myfunction <- function(x){
mean <- mean(x)
sd <- sd(x)
return(c(mean, sd))
} # 自定義函數(shù)myfunction泉蝌,函數(shù)參數(shù)為x歇万,函數(shù)語句包括mean和sd,返回結(jié)果也是mean和sd勋陪。
myfunction(df$v1) # 運行myfunction贪磺,返回的結(jié)果是df的v1列的平均值和標(biāo)準(zhǔn)差。
## [1] 1.2562500 0.1018017
5.6 整合與重構(gòu)
5.6.1 轉(zhuǎn)置
轉(zhuǎn)置(反轉(zhuǎn)行和列)也許是重塑數(shù)據(jù)集的眾多方法中最簡單的一個了诅愚。使用函數(shù)t()即可對一個矩陣或數(shù)據(jù)框進行轉(zhuǎn)置寒锚。對于后者,行名將成為變量(列)名违孝。
1:10 # 1到10的數(shù)刹前,為10行,1列雌桑。
## [1] 1 2 3 4 5 6 7 8 9 10
t(1:10) # 通過轉(zhuǎn)置喇喉,1到10變?yōu)榱?行,10列校坑。
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 2 3 4 5 6 7 8 9 10
A <- data.frame(name = c("one", "two", "three", "four", "five", "six", "seven", "eight"), values = c(1, 2, 3, 4, 5, 6, 7, 8), values2 = c(8, 7, 6, 5, 4, 3, 2, 1), row.names = c("r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8")) # 使用data.frame函數(shù)創(chuàng)建數(shù)據(jù)框A拣技,行名定義為r1到r8。
A # 顯示數(shù)據(jù)框A耍目。
## name values values2
## r1 one 1 8
## r2 two 2 7
## r3 three 3 6
## r4 four 4 5
## r5 five 5 4
## r6 six 6 3
## r7 seven 7 2
## r8 eight 8 1
as.data.frame(t(A)) # 將數(shù)據(jù)框A裝置膏斤。這里實際上是分了兩步完成的,t(A)將A轉(zhuǎn)置邪驮,但是系統(tǒng)將數(shù)值型變量全部變?yōu)榱俗址偷Ы剩由蟖s.data.frame,則將A變?yōu)閿?shù)據(jù)框耕捞。
## r1 r2 r3 r4 r5 r6 r7 r8
## name one two three four five six seven eight
## values 1 2 3 4 5 6 7 8
## values2 8 7 6 5 4 3 2 1
5.6.2 整合數(shù)據(jù)
aggregate(x, by, FUN)
其中x是待折疊的數(shù)據(jù)對象衔掸,by是一個變量名組成的列表,這些變量將被去掉以形成新的觀測俺抽,而FUN則是用來計算描述性統(tǒng)計量的標(biāo)量函數(shù)敞映,它將被用來計算新觀測中的值。
head(df) # 查看數(shù)據(jù)前6行磷斧。
## year nitrogen variety block v1 v2 v3 v4
## 1 2020 N1 a 1 1.26 2.14 3.4 4.66
## 2 2020 N1 a 2 1.20 2.90 4.1 5.30
## 3 2020 N1 a 3 1.30 3.00 4.3 5.60
## 4 2020 N1 b 1 1.08 1.72 2.8 3.88
## 5 2020 N1 b 2 1.05 1.65 2.7 3.75
## 6 2020 N1 b 3 1.15 1.35 2.5 3.65
aggregate(df[5:8], by = list(df$year), FUN = mean) # 對df數(shù)據(jù)框5到8列的數(shù)據(jù)振愿,依據(jù)df數(shù)據(jù)框中的year為分組依據(jù)進行平均值的統(tǒng)計。
## Group.1 v1 v2 v3 v4
## 1 2020 1.241667 2.908333 4.150 5.391667
## 2 2021 1.270833 3.254167 4.525 5.795833
aggregate(df[5:8], by = list(df$year, df$nitrogen), FUN = mean) # aggregate中的list可以是多因子弛饭,這里選擇了year和nitrogen冕末。
## Group.1 Group.2 v1 v2 v3 v4
## 1 2020 N1 1.173333 2.126667 3.300000 4.473333
## 2 2021 N1 1.226667 2.856667 4.083333 5.310000
## 3 2020 N2 1.310000 3.690000 5.000000 6.310000
## 4 2021 N2 1.315000 3.651667 4.966667 6.281667
aggregate(df[5:8], by = list(df$year, df$nitrogen, df$variety), FUN = mean) # 因子增加為year,nitrogen和variety侣颂。
## Group.1 Group.2 Group.3 v1 v2 v3 v4
## 1 2020 N1 a 1.253333 2.680000 3.933333 5.186667
## 2 2021 N1 a 1.213333 3.386667 4.600000 5.813333
## 3 2020 N2 a 1.316667 4.016667 5.333333 6.650000
## 4 2021 N2 a 1.406667 4.126667 5.533333 6.940000
## 5 2020 N1 b 1.093333 1.573333 2.666667 3.760000
## 6 2021 N1 b 1.240000 2.326667 3.566667 4.806667
## 7 2020 N2 b 1.303333 3.363333 4.666667 5.970000
## 8 2021 N2 b 1.223333 3.176667 4.400000 5.623333
aggregate(df[5:8], by = list(df$year, df$nitrogen, df$variety), FUN = myfunction) # 將自定義函數(shù)應(yīng)用于aggregate函數(shù)中档桃。
## Group.1 Group.2 Group.3 v1.1 v1.2 v2.1 v2.2 v3.1
## 1 2020 N1 a 1.25333333 0.05033223 2.6800000 0.4703190 3.9333333
## 2 2021 N1 a 1.21333333 0.02516611 3.3866667 0.1939931 4.6000000
## 3 2020 N2 a 1.31666667 0.03511885 4.0166667 0.2761038 5.3333333
## 4 2021 N2 a 1.40666667 0.04041452 4.1266667 0.2891943 5.5333333
## 5 2020 N1 b 1.09333333 0.05131601 1.5733333 0.1965536 2.6666667
## 6 2021 N1 b 1.24000000 0.13453624 2.3266667 0.3800439 3.5666667
## 7 2020 N2 b 1.30333333 0.02516611 3.3633333 0.5971879 4.6666667
## 8 2021 N2 b 1.22333333 0.06658328 3.1766667 0.3992910 4.4000000
## v3.2 v4.1 v4.2
## 1 0.4725816 5.1866667 0.4801389
## 2 0.1732051 5.8133333 0.1537314
## 3 0.2516611 6.6500000 0.2300000
## 4 0.3055050 6.9400000 0.3260368
## 5 0.1527525 3.7600000 0.1153256
## 6 0.2516611 4.8066667 0.1357694
## 7 0.6110101 5.9700000 0.6255398
## 8 0.3605551 5.6233333 0.3308071
5.6.3 reshape包
reshape包是一套重構(gòu)和整合數(shù)據(jù)集的絕妙的萬能工具。reshape2包是對reshape包的重寫憔晒,實際應(yīng)用中可使用reshape2包藻肄。
1.融合
數(shù)據(jù)集的融合是將它重構(gòu)為這樣一種格式:每個測量變量獨占一行蔑舞,行中帶有要唯一確定這個測量所需的標(biāo)識符變量。
melt(data, id.vars, measure.vars, variable.name = "variable", ..., na.rm = FALSE, value.name = "value", factorsAsStrings = TRUE)
data:需要處理的數(shù)據(jù)嘹屯; id.vars:設(shè)置融合后單獨顯示的變量攻询,可以用變量位置及名稱表示,沒寫表示使用所有非measure.vars值州弟;
measure.vars:通常根據(jù)id.vars設(shè)置的變化而變化钧栖;
na.rm:缺失值處理辦法;
variable.name:melt后為新列變量取名婆翔。
value.name:新列對應(yīng)值的變量名拯杠。
library(reshape2) # 調(diào)用reshape包。
rep <- rep(1:2,4) # 構(gòu)建rep列浙滤。
year <- c("2020","2020","2020","2020","2021","2021","2021","2021") #構(gòu)建Year列。
var1 <- sample(13:20) # 構(gòu)建var1列气堕。
var2 <- sample(1:8) # 構(gòu)建var2列纺腊。
df1 <- data.frame(rep, year, var1, var2) # 構(gòu)建新的數(shù)據(jù)框df1。
df1 # 顯示數(shù)據(jù)df1茎芭。
## rep year var1 var2
## 1 1 2020 18 4
## 2 2 2020 20 5
## 3 1 2020 16 1
## 4 2 2020 19 6
## 5 1 2021 17 3
## 6 2 2021 14 2
## 7 1 2021 15 7
## 8 2 2021 13 8
df2 <- melt(df1, id = c("rep","year"), variable.name = "var", value.name = "values") # 融合數(shù)據(jù)集df1揖膜。
df2 # 顯示數(shù)據(jù)。
## rep year var values
## 1 1 2020 var1 18
## 2 2 2020 var1 20
## 3 1 2020 var1 16
## 4 2 2020 var1 19
## 5 1 2021 var1 17
## 6 2 2021 var1 14
## 7 1 2021 var1 15
## 8 2 2021 var1 13
## 9 1 2020 var2 4
## 10 2 2020 var2 5
## 11 1 2020 var2 1
## 12 2 2020 var2 6
## 13 1 2021 var2 3
## 14 2 2021 var2 2
## 15 1 2021 var2 7
## 16 2 2021 var2 8
2.重鑄
dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL, subset = NULL, fill = NULL, drop = TRUE, value.var = guess_value(data))
data:要處理的數(shù)據(jù)集梅桩;
formula:處理公式壹粟,描述了想要的最后結(jié)果;其接受的公式形如:rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 +...;
在這一公式中宿百,rowvar1 + rowvar2 +...定義了要劃掉的變量集合趁仙,以確定各行的內(nèi)容,而colvar1 + colvar2 + ...則定義了要劃掉的垦页、確定各列內(nèi)容的變量集合雀费。 fun.aggregate:數(shù)據(jù)整合函數(shù),如求均值等痊焊。
library(reshape2) # 調(diào)用reshape2包盏袄。
head(df2) # 顯示數(shù)據(jù)df2。
## rep year var values
## 1 1 2020 var1 18
## 2 2 2020 var1 20
## 3 1 2020 var1 16
## 4 2 2020 var1 19
## 5 1 2021 var1 17
## 6 2 2021 var1 14
dcast(df2, year+rep~var, value.var = "values", fun.aggregate = sum) # 將df2重鑄薄啥,rep辕羽,year確定保留的行,var確定了列的集合垄惧,整合的變量是value刁愿,整合函數(shù)是求和。
## year rep var1 var2
## 1 2020 1 34 5
## 2 2020 2 39 11
## 3 2021 1 32 10
## 4 2021 2 27 10
參考資料:
- 《R語言實戰(zhàn)》(中文版)到逊,人民郵電出版社酌毡,2013.
- R語言-數(shù)據(jù)整形之a(chǎn)ggregate函數(shù)克握,https://blog.csdn.net/weixin_30496751/article/details/99511041?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&dist_request_id=1328679.50708.16163819563121551&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control
- R|melt()函數(shù)學(xué)習(xí),http://www.reibang.com/p/ebcbd0d1af18
- R語言入門:函數(shù)系列(4)------melt和cast枷踏,https://vlambda.com/wz_5lUh2wUNw50.html