《R語言實戰(zhàn)》自學(xué)筆記31-用戶自編函數(shù)和整合與重構(gòu)

數(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ù),如求均值等痊焊。

image.png
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

參考資料:

  1. 《R語言實戰(zhàn)》(中文版)到逊,人民郵電出版社酌毡,2013.
  2. 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
  3. R|melt()函數(shù)學(xué)習(xí),http://www.reibang.com/p/ebcbd0d1af18
  4. R語言入門:函數(shù)系列(4)------melt和cast枷踏,https://vlambda.com/wz_5lUh2wUNw50.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菩暗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旭蠕,更是在濱河造成了極大的恐慌停团,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掏熬,死亡現(xiàn)場離奇詭異佑稠,居然都是意外死亡,警方通過查閱死者的電腦和手機旗芬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門舌胶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疮丛,你說我怎么就攤上這事幔嫂。” “怎么了誊薄?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵履恩,是天一觀的道長。 經(jīng)常有香客問我呢蔫,道長切心,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任片吊,我火速辦了婚禮绽昏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俏脊。我一直安慰自己而涉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布联予。 她就那樣靜靜地躺著啼县,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沸久。 梳的紋絲不亂的頭發(fā)上季眷,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音卷胯,去河邊找鬼子刮。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挺峡。 我是一名探鬼主播葵孤,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼橱赠!你這毒婦竟也來了尤仍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤狭姨,失蹤者是張志新(化名)和其女友劉穎宰啦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饼拍,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡赡模,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了师抄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漓柑。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叨吮,靈堂內(nèi)的尸體忽然破棺而出辆布,到底是詐尸還是另有隱情,我是刑警寧澤挤安,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布谚殊,位于F島的核電站丧鸯,受9級特大地震影響蛤铜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丛肢,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一围肥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜂怎,春花似錦穆刻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至幽歼,卻和暖如春朵锣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背甸私。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工诚些, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皇型。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓诬烹,卻偏偏與公主長得像砸烦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绞吁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容