楼主: 林随机漫步
1172 2

[学习分享] R语言快速入门Ⅱ:类SQL数据操作总结2 [推广有奖]

  • 1关注
  • 3粉丝

已卖:1份资源

硕士生

7%

还不是VIP/贵宾

-

威望
0
论坛币
154 个
通用积分
102.8396
学术水平
11 点
热心指数
11 点
信用等级
11 点
经验
1957 点
帖子
67
精华
0
在线时间
138 小时
注册时间
2014-1-11
最后登录
2025-9-29

楼主
林随机漫步 发表于 2019-9-18 22:05:16 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


沙发
林随机漫步 发表于 2019-9-23 16:26:25 来自手机
林随机漫步 发表于 2019-9-18 22:05
4.过滤/筛选过滤,是对数据集按照某种规则进行筛选,去掉不符合条件的数据,保留符合条件的数据。对于NA值 ...
顶一下

藤椅
hifinecon 发表于 2019-9-28 08:31:47

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-7 19:14