《R与tidyverse——数据分析入门》学习笔记
R与tidyverse——数据分析入门
3. dataframe 和 tibble
- R中的多变量数据的标准保存形式是dataframe;tibble是dataframe的进化版。
-
一个正确的dataframe
- 创建tibble
3.1 新建一个tibble
tbble()
【注意】tibble是按列写入的
举例:
my_tibble_1 <- tibble(
nums = c(4, 5, 6),
chars = c("hej", "你好", "こんにちは"),
cplxnums = c("4+8i", "3+5i", "3+4i")
)
tribble()函数亦可用来创建新tibble. 与tibble()的区别是,tibble()是逐列写入数据,tribble()是逐行写入数据。
3.2 把dataframe转变为tibble
a1 <- as_tibble(a) #a是一个已经建好的dataframe
3.3 从外部数据创建tibble
安装readr包,使用read_csv
等命令可以比base包中的read.csv
更快导入数据,而且可以直接生成tibble格式
- 在dplyr中进行数据变换
4.1 提取单列
$
(仅用于变量名称)与[[]]
(变量名称或索引)
4.2 提取多列
select()
可以抓取多列,并返回一个tibble
select(test1,Sepal.Length,Species)
#可以额外地按照你指定的顺序重排
select(test1, Species, ends_with("Length"))
#ends_with函数用于找名称中包含Length的列
4.3 提取observations(即 “行”)
filter()
可以过滤出某个或多个变量满足某种条件的observations.
#假设我们只想看种名为 virginica且花瓣长度在4和5之间的鸢尾花:
iris_2 <- filter(iris, Species == "virginica", Petal.Length >= 4 & Petal.Length < 5)
4.4 通过索引行数提取行
slice()
iris_3 <- slice(iris, 21:24) # 抓取`iris`的第21行至24行
4.5 排序
arrange()
默认从小到大排序
若要从大到小,可以
arrange(iris, -Sepal.Length)
#或
arrange(iris, desc(Sepal.Length))
根据Petal.Width从小到大的顺序排列,若有并列,再根据Petal.Length从大到小的顺序排列
arrange(iris, Petal.Width, -Petal.Length)
4.6 用mutate新增变量或重新赋值变量
mutate()
的第一个参数是dataframe/tibble的名称,接下来的参数都是变量名和它们所对应的值;可以直接在计算它们的值的表达式中使用tibble中原有的变量名,如height, weight
women <- as_tibble(datasets::women)#使用datasets中的数据women举例
women
women1 <- mutate(women,
height_in_m = height/39.37,
weight_in_kg = weight/2.204) #在新tibble中新增变量,将height和weight改成以m和kg为单位
women1
women2 <- mutate(women, height = height/39.37, weight = weight/2.204)#在新tibble中对height和weight进行重新赋值
women2
women3<-mutate(women2,BMI=weight/height^2)
women3
4.7 管道操作
%>%
的名称是“pipe operator”,快捷键默认是command+shift+M
其本质上就是把它左边的运算结果作为右边函数的第一个参数,然后再根据使用者提供的其它参数计算右边的函数。第一行是操作的对象 (aids),下面每一行是一次操作,与逻辑顺序一致,而且不需要每进行一次操作就赋值/重新引用新的数据,每个函数的第一个参数(dataframe/tibble名称)被省略了。
aids_4<-select(mutate(filter(aids,status=="D"),span=death-diag),span)
#一环套一环,读取不易,且需要从里往外读
head(aids_4)
# A tibble: 6 x 1
span
1 176
2 67
3 432
4 77
5 275
6 373
aids_5<-aids %>% filter(status=="D") %>% mutate(span=death-diag) %>% select(span)
#使用管道操作后可以从前往后读取,逻辑顺畅,且不易出错
head(aids_5)
# A tibble: 6 x 1
span
1 176
2 67
3 432
4 77
5 275
6 373
identical(aids_4,aids_5)
[1] TRUE
4.8 group_by与summarise
这是两个经常被放在一起使用的,实用且强大的函数。
group_by()
用于分组
summarise()
可以汇总计算平均值、标准差、标准误等等
> wb_group<-group_by(wb,wool,tension)
> wb_group
# A tibble: 54 x 3
# Groups: wool, tension [6]
breaks wool tension
1 26 A L
2 30 A L
3 54 A L
4 25 A L
5 70 A L
6 52 A L
7 51 A L
8 26 A L
9 67 A L
10 18 A M
# … with 44 more rows
> wb_sum <- summarise(wb_group,n = n(),MEAN= mean(breaks))
`summarise()` regrouping output by 'wool' (override with `.groups` argument)
> wb_sum
# A tibble: 6 x 4
# Groups: wool [2]
wool tension n MEAN
1 A L 9 44.6
2 A M 9 24
3 A H 9 24.6
4 B L 9 28.2
5 B M 9 28.8
6 B H 9 18.8