数据准备
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:数据整合函数,如求均值等。
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
参考资料:
- 《R语言实战》(中文版),人民邮电出版社,2013.
- 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
- R|melt()函数学习,https://www.jianshu.com/p/ebcbd0d1af18
- R语言入门:函数系列(4)------melt和cast,https://vlambda.com/wz_5lUh2wUNw50.html