4.过滤/筛选
过滤,是对数据集按照某种规则进行筛选,去掉不符合条件的数据,保留符合条件的数据。对于NA值的操作,主要都集中在了过滤操作和填充操作中,因此就不在单独介绍NA值的处理了。4.1 缺失值处理
# 生成数据框> df<-data.frame(a=c(1,NA,NA,2,NA),+ b=c('B','A','B','B',NA),+ c=c(rnorm(2),NA,NA,NA));df a b c1 1 B -0.30418392 NA A 0.37001883 NA B NA4 2 B NA5 NA <NA> NA
# 过滤有NA行的数据> na.omit(df) a b c1 1 B -0.3041839
# 过滤,保留b列值为B的数据> df[which(df$b=='B'),] a b c1 1 B -0.30418393 NA B NA4 2 B NA
4.2 数据增减
常见如以下不同方法
#方法一:减行数或列数x=x[,-1] #代表删除x数据集中第一列数据#方法二:dplyr::mutate#数值重定义和赋值#将Ozone列取负数赋值给new,然后Temp列重新计算为(Temp - 32) / 1.8mutate(airquality, new = -Ozone, Temp = (Temp - 32) / 1.8)
#方法三:subset筛选变量服从某值的子集subset(airquality, Temp > 80, select = c(Ozone, Temp))
4.3 数值分段
数值分段,就是把一个连续型的数值型数据,按区间分割为因子类型的离散型数据。
> x<-1:10;x [1] 1 2 3 4 5 6 7 8 9 10
# 把向量转换为3段因子,分别列出每个值对应因子> cut(x, 3) [1] (0.991,4] (0.991,4] (0.991,4] (0.991,4] (4,7] (4,7] (4,7] (7,10] (7,10] (7,10]Levels: (0.991,4] (4,7] (7,10]
# 对因子保留2位精度,并支持排序> cut(x, 3, dig.lab = 2, ordered = TRUE) [1] (0.99,4] (0.99,4] (0.99,4] (0.99,4] (4,7] (4,7] (4,7] (7,10] (7,10] (7,10]Levels: (0.99,4] < (4,7] < (7,10]
5 分组操作
此处仅讲述aggregate数据分组计算内容,更多分组计算内容
参考→《R语言 分组计算,不止group_by》
dplyr包中的group_by联合summarize
group_by和summarise单变量分组计算
group_by和summarise多变量分组计算
ddply分组计算示例
5.1 aggregate语法
aggregate(x, by, FUN)#x为数据集#by为分组变量列表#FUN为计算函数5.2 aggregate分组计算
> row_names <- rep(c("A","B","C"),3)> col_names <- LETTERS[1:3]> df_matrix <- matrix(c(1:27),nrow = 9,dimnames = list(row_names,col_names))> df_matrix A B CA 1 10 19B 2 11 20C 3 12 21A 4 13 22B 5 14 23C 6 15 24A 7 16 25B 8 17 26C 9 18 27#注意分组变量为列表形式> aggregate(df_matrix,list(Group = row_names), mean) Group A B C1 A 4 13 222 B 5 14 233 C 6 15 24
5.3 aggregate分组计算补充(formula形式)
可以重点了解一下
aggregate(formula, data, FUN)#Formulas, one ~ one, one ~ many, many ~ one, and many ~ many:#一组对一计算变量函数型分组计算:计算变量~分组变量> aggregate(weight ~ feed, data = chickwts, mean) feed weight1 casein 323.58332 horsebean 160.20003 linseed 218.75004 meatmeal 276.90915 soybean 246.42866 sunflower 328.9167
#多组对一函数型分组计算:计算变量~分组变量1+分组变量2……> aggregate(breaks ~ wool + tension, data = warpbreaks, mean) wool tension breaks1 A L 44.555562 B L 28.222223 A M 24.000004 B M 28.777785 A H 24.555566 B H 18.77778
#一组对多计算变量,函数型分组计算:cbind(计算变量1,计算变量2)~分组变量1> aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, mean) Month Ozone Temp1 5 23.61538 66.730772 6 29.44444 78.222223 7 59.11538 83.884624 8 59.96154 83.961545 9 31.44828 76.89655
#多组对多计算变量,函数型分组计算:cbind(计算变量1,计算变量2)~分组变量1+分组变量2……> aggregate(cbind(ncases, ncontrols) ~ alcgp + tobgp, data = esoph, sum) alcgp tobgp ncases ncontrols1 0-39g/day 0-9g/day 9 2612 40-79 0-9g/day 34 1793 80-119 0-9g/day 19 614 120+ 0-9g/day 16 245 0-39g/day 10-19 10 846 40-79 10-19 17 857 80-119 10-19 19 498 120+ 10-19 12 189 0-39g/day 20-29 5 4210 40-79 20-29 15 6211 80-119 20-29 6 1612 120+ 20-29 7 1213 0-39g/day 30+ 5 2814 40-79 30+ 9 2915 80-119 30+ 7 1216 120+ 30+ 10 13
6. 排序
#order默认升序,变量前加“-”代表降序
#排序的操作,大多都是基于索引来完成的#用order()函数来生成索引,再匹配的数据的数值上面。
> row_names <- rep(c("A","B","C"),3)
> col_names <- LETTERS[1:3]
> set.seed(1234)
> df_matrix <- matrix(round(rnorm(27,0,1),3),nrow = 9,dimnames = list(NULL,col_names));df_matrix
A B C [1,] -1.207 -0.890 -0.837 [2,] 0.277 -0.477 2.416 [3,] 1.084 -0.998 0.134 [4,] -2.346 -0.776 -0.491 [5,] 0.429 0.064 -0.441 [6,] 0.506 0.959 0.460 [7,] -0.575 -0.110 -0.694 [8,] -0.547 -0.511 -1.448 [9,] -0.564 -0.911 0.575
> df_frame <- data.frame(group=row_names,df_matrix);df_frame
group A B C1 A -1.207 -0.890 -0.8372 B 0.277 -0.477 2.4163 C 1.084 -0.998 0.1344 A -2.346 -0.776 -0.4915 B 0.429 0.064 -0.4416 C 0.506 0.959 0.4607 A -0.575 -0.110 -0.6948 B -0.547 -0.511 -1.4489 C -0.564 -0.911 0.575>
> #order,其中默认升序,变量前加“-”代表降序> #排序的操作,大多都是基于索引来完成的> #用order()函数来生成索引,再匹配的数据的数值上面。> df_frame[order(df_frame$A),] group A B C4 A -2.346 -0.776 -0.4911 A -1.207 -0.890 -0.8377 A -0.575 -0.110 -0.6949 C -0.564 -0.911 0.5758 B -0.547 -0.511 -1.4482 B 0.277 -0.477 2.4165 B 0.429 0.064 -0.4416 C 0.506 0.959 0.4603 C 1.084 -0.998 0.134> df_frame[order(df_frame$group,-df_frame$A),] group A B C7 A -0.575 -0.110 -0.6941 A -1.207 -0.890 -0.8374 A -2.346 -0.776 -0.4915 B 0.429 0.064 -0.4412 B 0.277 -0.477 2.4168 B -0.547 -0.511 -1.4483 C 1.084 -0.998 0.1346 C 0.506 0.959 0.4609 C -0.564 -0.911 0.575
7. 计数
计数,是统计同一个值出现的次数。
# 生成20个随机数的向量set.seed(1234)x<-round(rnorm(20)*5);x# 统计每个值出现的次数table(x)hist(x,xlim = c(-10,13),breaks=5)
8 数据分裂
分裂计算,是把一个向量按照一列规则,拆分成多个向量的操作。有时候分裂split也被用于分组计算中。
> row_names <- rep(c("A","B","C"),3)> col_names <- LETTERS[1:3]> df_matrix <- matrix(c(1:27),nrow = 9,dimnames = list(NULL,col_names))> row_names <- rep(c("A","B","C"),3)> col_names <- LETTERS[1:3]> df_matrix <- matrix(c(1:27),nrow = 9,dimnames = list(NULL,col_names));df_matrix A B C [1,] 1 10 19 [2,] 2 11 20 [3,] 3 12 21 [4,] 4 13 22 [5,] 5 14 23 [6,] 6 15 24 [7,] 7 16 25 [8,] 8 17 26 [9,] 9 18 27> df_frame <- data.frame(group=row_names,df_matrix);df_frame group A B C1 A 1 10 192 B 2 11 203 C 3 12 214 A 4 13 225 B 5 14 236 C 6 15 247 A 7 16 258 B 8 17 269 C 9 18 27> df_split <- split(df_frame,row_names);df_split$A group A B C1 A 1 10 194 A 4 13 227 A 7 16 25
$B group A B C2 B 2 11 205 B 5 14 238 B 8 17 26
$C group A B C3 C 3 12 216 C 6 15 249 C 9 18 27
另外,可以用因子类型来控制分裂。分成2步操作,第一步先分成与数据集同样长度的因子,第二步进行分裂,可以把一个大的向量拆分成多个小的向量。
> # 生成因子规则> n <- 3; size <- 5> fat <- factor(round(n * runif(n * size)));fat [1] 3 3 1 1 0 1 2 1 3 3 1 1 2 2 2Levels: 0 1 2 3> # 生成数据向量> x <- rnorm(n * size);x [1] -1.2107366 -1.3102467 -0.4083354 -0.5629753 1.2139442 1.6288760 -0.3160227 -1.8076242 -0.6125961[10] -2.1066644 1.2053009 1.3294407 -0.6836288 -1.7868047 0.1364916> # 对向量以因子的规则进行拆分> split(x, fat)$`0`[1] 1.213944$`1`[1] -0.4083354 -0.5629753 1.6288760 -1.8076242 1.2053009 1.3294407
$`2`[1] -0.3160227 -0.6836288 -1.7868047 0.1364916
$`3`[1] -1.2107366 -1.3102467 -0.6125961 -2.1066644


雷达卡




京公网安备 11010802022788号







