《R语言实战》自学笔记31-用户自编函数和整合与重构

数据准备

df <- read.table(file = "D:/Documents/R wd/df.csv", header = T, sep = ",", colClasses = c(year = "character", nitrogen = "character", variety = "character", block = "character")) # 数据导入。
df # 查看数据。
##    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 用户自编函数

R的最大优点之一就是用户可以自行添加函数。
myfunction <- function(arg1, arg2, ... ){ statements return(object) }
myfunction是自定义函数的名称,arg1,arg2为参数,statements为函数语句,用于定义函数的作用,return(object)返回结果。

myfunction <- function(x){
  mean <- mean(x)
  sd <- sd(x)
  return(c(mean, sd))
} # 自定义函数myfunction,函数参数为x,函数语句包括mean和sd,返回结果也是mean和sd。
myfunction(df$v1) # 运行myfunction,返回的结果是df的v1列的平均值和标准差。
## [1] 1.2562500 0.1018017

5.6 整合与重构

5.6.1 转置

转置(反转行和列)也许是重塑数据集的众多方法中最简单的一个了。使用函数t()即可对一个矩阵或数据框进行转置。对于后者,行名将成为变量(列)名。

1:10 # 1到10的数,为10行,1列。
##  [1]  1  2  3  4  5  6  7  8  9 10
t(1:10) # 通过转置,1到10变为了1行,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函数创建数据框A,行名定义为r1到r8。
A # 显示数据框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)) # 将数据框A装置。这里实际上是分了两步完成的,t(A)将A转置,但是系统将数值型变量全部变为了字符型,加上as.data.frame,则将A变为数据框。
##          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 整合数据

aggregate(x, by, FUN)
其中x是待折叠的数据对象,by是一个变量名组成的列表,这些变量将被去掉以形成新的观测,而FUN则是用来计算描述性统计量的标量函数,它将被用来计算新观测中的值。

head(df) # 查看数据前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数据框5到8列的数据,依据df数据框中的year为分组依据进行平均值的统计。
##   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) # 将自定义函数应用于aggregate函数中。
##   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包是一套重构和整合数据集的绝妙的万能工具。reshape2包是对reshape包的重写,实际应用中可使用reshape2包。
1.融合
数据集的融合是将它重构为这样一种格式:每个测量变量独占一行,行中带有要唯一确定这个测量所需的标识符变量。
melt(data, id.vars, measure.vars, variable.name = "variable", ..., na.rm = FALSE, value.name = "value", factorsAsStrings = TRUE)
data:需要处理的数据; id.vars:设置融合后单独显示的变量,可以用变量位置及名称表示,没写表示使用所有非measure.vars值;
measure.vars:通常根据id.vars设置的变化而变化;
na.rm:缺失值处理办法;
variable.name:melt后为新列变量取名。
value.name:新列对应值的变量名。

library(reshape2) # 调用reshape包。
rep <- rep(1:2,4) # 构建rep列。
year <- c("2020","2020","2020","2020","2021","2021","2021","2021") #构建Year列。
var1 <- sample(13:20) # 构建var1列。
var2 <- sample(1:8) # 构建var2列。
df1 <- data.frame(rep, year, var1, var2) # 构建新的数据框df1。
df1 # 显示数据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") # 融合数据集df1。
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
## 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:要处理的数据集;
formula:处理公式,描述了想要的最后结果;其接受的公式形如:rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 +...;
在这一公式中,rowvar1 + rowvar2 +...定义了要划掉的变量集合,以确定各行的内容,而colvar1 + colvar2 + ...则定义了要划掉的、确定各列内容的变量集合。 fun.aggregate:数据整合函数,如求均值等。

image.png
library(reshape2) # 调用reshape2包。
head(df2) # 显示数据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,整合函数是求和。
##   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语言实战》(中文版),人民邮电出版社,2013.
  2. R语言-数据整形之aggregate函数,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()函数学习,https://www.jianshu.com/p/ebcbd0d1af18
  4. R语言入门:函数系列(4)------melt和cast,https://vlambda.com/wz_5lUh2wUNw50.html
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容