数据处理过程中,针对数据框,可以进行列的添加,以及长、宽数据的转化。
在实际应用中,宽型数据更具可读性,长型数据则更适合做分析。
一 reshape2包中两个主要的函数
melt—将宽型数据融合成长型数据;cast—将长型数据转成宽型数据
此处用R内置的airquality数据集,首先将列名改成小写,然后查看相应的数据
library(reshape2) library(ggplot2) names(airquality) <- tolower(names(airquality)) head(airquality) ozone solar.r wind temp month day 1 41 190 7.4 67 5 1 2 36 118 8.0 72 5 2 3 12 149 12.6 74 5 3 4 18 313 11.5 62 5 4 5 NA NA 14.3 56 5 5 6 28 NA 14.9 66 5 6
1.1 melt函数 (宽转长)
id.vars中指定相应变量;variable.name和value.name分别对variable和value列重命名 airMelt1 <- melt(airquality) head(airMelt1,4) variable value 1 ozone 41 2 ozone 36 3 ozone 12 4 ozone 18
1.1.2 将month和day共同作为ID variables(那些能够区分不同行数据的变量共同作为变量),且修改长数据中的列名
airMelt2 <- melt(airquality, id.vars = c("month", "day"), variable.name = "variable.name", value.name = "variable.value") head(airMelt2,4) month day variable.name variable.value 1 5 1 ozone 41 2 5 2 ozone 36 3 5 3 ozone 12 4 5 4 ozone 18
1.2 cast函数 (长转宽)
dcast:左边参数表示"ID variables",右边的参数表示measured variables。
1.2.1 month和day是ID variables,variable则表示measured variables。
airMelt3 <- melt(airquality, id.vars = c("month", "day")) airDcast <- dcast(airMelt3, month + day ~ variable) head(airDcast) month day ozone solar.r wind temp 1 5 1 41 190 7.4 67 2 5 2 36 118 8.0 72 3 5 3 12 149 12.6 74 4 5 4 18 313 11.5 62 5 5 5 NA NA 14.3 56 6 5 6 28 NA 14.9 66
1.2.2 一个数据单元有一个以上的数据。比如,我们的ID variables不包含day,
dcast(airMelt3, month ~ variable) #Aggregation function missing: defaulting to length month ozone solar.r wind temp 1 5 31 31 31 31 2 6 30 30 30 30 3 7 31 31 31 31 4 8 31 31 31 31 5 9 30 30 30 30
可以看到每个单元是month与climate组合的个数。所得到数据是month对应的day的记录数
1.2.3 聚合(aggregate)这些数据,比如取mean,median,sum。比如计算均值,通过na.rm = TRUE删除NA值。
dcast(aql, month ~ variable, fun.aggregate = mean, na.rm = TRUE) month ozone solar.r wind temp 1 5 23.61538 181.2963 11.622581 65.54839 2 6 29.44444 190.1667 10.266667 79.10000 3 7 59.11538 216.4839 8.941935 83.90323 4 8 59.96154 171.8571 8.793548 83.96774 5 9 31.44828 167.4333 10.180000 76.90000
二 $、with、within、transform等进行列的添加
head(airquality)
2.1 $符添加列
data<-head(airquality) data1$logwind <- log(data$wind) data1
2.2 within 必须在新添加的变量中加上花括号
data2 <- within(data,{logwind = log(wind)}) data2
2.3 with 也可以使用with函数,该函数可以用于任何表达式的计算,但每次只能生成一个计算字段,最后还需要结合使用cbind函数
data3 <- cbind(data3,with(data,log(wind))) data3
2.4 transform函数
data4 <- transform(data,logwind = log(wind),day2 = day^2) data4 ozone solar.r wind temp month day logwind day2 1 41 190 7.4 67 5 1 2.001480 1 2 36 118 8.0 72 5 2 2.079442 4 3 12 149 12.6 74 5 3 2.533697 9 4 18 313 11.5 62 5 4 2.442347 16 5 NA NA 14.3 56 5 5 2.660260 25 6 28 NA 14.9 66 5 6 2.701361 36