R语言学习笔记——数据的分组处理

更新时间:2023-07-13 13:12:27 阅读: 评论:0

R语⾔学习笔记——数据的分组处理
⼀、R语⾔实现数据的分组求和
实验数据集 姓名,年龄,班级 ,成绩, 科⽬
student <- data.frame (
name = c("s1", "s2", "s3", "s2", "s1", "s3"),
age = c(12, 13, 10, 13, 12, 10),
classid = c("c1", "c2", "c3", "c2", "c1", "c3"),
score = c(78, 68, 99, 81, 82, 90),
国际法的渊源subject = c("su1", "su1", "su1", "su2", "su2", "su2")
)
下⾯看看 students 的结构
> str(students)
'data.frame': 6 obs. of  5 variables:
$ name  : Factor w/ 3 levels "s1","s2","s3": 1 2 3 2 1 3
$ age    : num  12 13 10 13 12 10
$ classid: Factor w/ 3 levels "c1","c2","c3": 1 2 3 2 1 3
$ score  : num  78 68 99 81 82 90
$ subject: Factor w/ 2 levels "su1","su2": 1 1 1 2 2 2
可以看到,在调⽤ data.frame 函数之后,默认将字符形变量转换成了因⼦变量,并且重新对它们进⾏编码
下⾯我们求每个班级平均成绩:⽤SQL语句如下
lect count(score) from students group by subject
⽤R⾃带的函数 tapply 也可以实现上⾯的要求:
> tapply(student$score, students$subject, sum)
su1 su2
245 253
从tapply的执⾏结果我们可以看出,tapply 是根据第⼆个变量因⼦变量(注意必须是因⼦变量)对第⼀个变量来分组,然后对所有分成的⼩组调⽤最后的函数
再来看⼀个例⼦,加深对因⼦的理解:
> affils <- c("R", "D", "D", "R", "U", "D")
> affils <- as.factor(x = affils)
十五英语怎么说
> affils
[1] R D D R U D
Levels: D R U
> affils <- factor(affils, ordered = TRUE)
> affils
[1] R D D R U D
Levels: D < R < U
> affils <- factor(affils, levels = c("U", "R", "D"),  ordered = TRUE)
> tapply(ages, affils, mean)
U  R  D
21 31 41
> ages <- c(25, 26, 55, 37, 21, 42)
> affils <- c("R", "D", "D", "R", "U", "D")
戕的拼音
> affils <- as.factor(x = affils)
> affils
[1] R D D R U D
诗词满江红
Levels: D R U
> affils <- factor(affils, ordered = TRUE)
> affils
[1] R D D R U D
Levels: D < R < U
> affils <- factor(affils, levels = c("U", "R", "D"),  ordered = TRUE)
> affils
[1] R D D R U D
Levels: U < R < D
> tapply(ages, affils, mean)
U  R  D
21 31 41
从例⼦中可以发现,因⼦的⽔平,以及⽔平的⾼低我们都是可以按照⾃⼰的想法去控制的
好了,有了上⾯的基础知识,下⾯进⼀步加⼤难度,如果分组变量有⼏个呢?
请看下⾯的例⼦:
实验数据如下:
> staff <- data.frame(list(gender = c("M", "M", "F", "M", "F", "F"),
皂角的功效与作用+                      age = c(47, 59, 21, 32, 33, 24),
+                      income = c(55000, 88000, 32450, 76500, 123000, 45650)
+                      )
+                )
> staff
gender age income
1      M  47  55000
2      M  59  88000
3      F  21  32450
4      M  32  76500
时常的近义词5      F  33 123000
6      F  24  45650
> str(staff)
'data.frame': 6 obs. of  3 variables:
$ gender: Factor w/ 2 levels "F","M": 2 2 1 2 1 1
$ age  : num  47 59 21 32 33 24
$ income: num  55000 88000 32450 76500 123000 ...
下⾯分析:年龄⼤于 25 的不同性别的总收⼊,以及年龄⼩于 25 的不同性别的总收⼊
> staff$over25 <- ifel(staff$age > 25, 1, 0)
> staff
gender age income over25
1      M  47  55000      1
丰绅殷德2      M  59  88000      1
3      F  21  32450      0
4      M  32  76500      1
5      F  33 123000      1
6      F  24  45650      0
> tapply(staff$income, list(staff$gender, staff$over25), sum)
0      1
F 78100 123000
M    NA 219500
从结果中可以清楚的看到,年龄⼩于 25 的⼥员⼯总收⼊为 78100, 其他的同理可以分析出来
⼆、如果你只是想分组呢?那么你就要要⽤到 spit 函数,注意字符串的分割是⽤ strsplit, 下⾯看如下两个例⼦就清楚明了了
> split(staff$income, list(staff$over25, staff$gender))
$`0.F`
[1] 32450 45650
$`1.F`
[1] 123000
$`0.M`
numeric(0)
$`1.M`
[1] 55000 88000 76500
> split(staff$income, list(staff$gender, staff$over25))
$F.0
[1] 32450 45650
$M.0
numeric(0)
$F.1
[1] 123000
$M.1
[1] 55000 88000 76500
从上⾯的例⼦我们可以⾮常清楚的明⽩ split 函数的⼯作原理
下⾯看⼀个有意思的例⼦,利⽤ split 迅速定位上⾯男性的下标,⼀种⾮常⾃然的想法是排序,然后如果数据总是变化⽆常怎么定位我们想要的那⼀类数据的下标呢?
> split(1:length(staff$gender), staff$gender)
属马和属蛇的合不合
$F
[1] 3 5 6
$M
[1] 1 2 4
如果我们将这个⽅法与⽂本挖掘联想到⼀起,我们可以发现,这个⽅法可以⾮常容易的解决英⽂⽂本词汇索引的问题:
如果给你⼀个⽂本⽂件,假设单词都是按照空格分割,现在要统计哪些单词出现在⽂本中,以及出现的位置和次数,我们可以⽤下⾯的⽅法⾮常容易的解决
filewords <- function(tf) {
txt <- scan(tf, "")
words <- split(1:length(txt), txt)
return(words)
}
另外我们应该关注 by() 函数的使⽤
最后⼀句话:在R中如果可以不使⽤循环则⼒求不使⽤

本文发布于:2023-07-13 13:12:27,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1094350.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   变量   分组   函数   单词   出现
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图