《R與tidyverse——數(shù)據(jù)分析入門》學習筆記
3. dataframe 和 tibble
- R中的多變量數(shù)據(jù)的標準保存形式是dataframe耀里;tibble是dataframe的進化版失暴。
-
一個正確的dataframe
書中截圖 - 創(chuàng)建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()函數(shù)亦可用來創(chuàng)建新tibble. 與tibble()的區(qū)別是,tibble()是逐列寫入數(shù)據(jù)讹剔,tribble()是逐行寫入數(shù)據(jù)颅眶。
3.2 把dataframe轉(zhuǎn)變?yōu)閠ibble
a1 <- as_tibble(a) #a是一個已經(jīng)建好的dataframe
3.3 從外部數(shù)據(jù)創(chuàng)建tibble
安裝readr包蜈出,使用read_csv
等命令可以比base包中的read.csv
更快導入數(shù)據(jù),而且可以直接生成tibble格式
- 在dplyr中進行數(shù)據(jù)變換
4.1 提取單列
$
(僅用于變量名稱)與[[]]
(變量名稱或索引)
4.2 提取多列
select()
可以抓取多列涛酗,并返回一個tibble
屏幕快照 2020-12-18 下午3.25.09.png
select(test1,Sepal.Length,Species)
#可以額外地按照你指定的順序重排
select(test1, Species, ends_with("Length"))
#ends_with函數(shù)用于找名稱中包含Length的列
4.3 提取observations(即 “行”)
filter()
可以過濾出某個或多個變量滿足某種條件的observations.
#假設我們只想看種名為 virginica且花瓣長度在4和5之間的鳶尾花:
iris_2 <- filter(iris, Species == "virginica", Petal.Length >= 4 & Petal.Length < 5)
4.4 通過索引行數(shù)提取行
slice()
iris_3 <- slice(iris, 21:24) # 抓取`iris`的第21行至24行
4.5 排序
arrange()
默認從小到大排序
若要從大到小铡原,可以
arrange(iris, -Sepal.Length)
#或
arrange(iris, desc(Sepal.Length))
根據(jù)Petal.Width從小到大的順序排列,若有并列煤杀,再根據(jù)Petal.Length從大到小的順序排列
arrange(iris, Petal.Width, -Petal.Length)
4.6 用mutate新增變量或重新賦值變量
mutate()
的第一個參數(shù)是dataframe/tibble的名稱眷蜈,接下來的參數(shù)都是變量名和它們所對應的值;可以直接在計算它們的值的表達式中使用tibble中原有的變量名沈自,如height, weight
women <- as_tibble(datasets::women)#使用datasets中的數(shù)據(jù)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
其本質(zhì)上就是把它左邊的運算結(jié)果作為右邊函數(shù)的第一個參數(shù)枯途,然后再根據(jù)使用者提供的其它參數(shù)計算右邊的函數(shù)忌怎。第一行是操作的對象 (aids),下面每一行是一次操作酪夷,與邏輯順序一致榴啸,而且不需要每進行一次操作就賦值/重新引用新的數(shù)據(jù),每個函數(shù)的第一個參數(shù)(dataframe/tibble名稱)被省略了晚岭。
aids_4<-select(mutate(filter(aids,status=="D"),span=death-diag),span)
#一環(huán)套一環(huán)鸥印,讀取不易,且需要從里往外讀
head(aids_4)
# A tibble: 6 x 1
span
<int>
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
<int>
1 176
2 67
3 432
4 77
5 275
6 373
identical(aids_4,aids_5)
[1] TRUE
4.8 group_by與summarise
這是兩個經(jīng)常被放在一起使用的狂鞋,實用且強大的函數(shù)。
group_by()
用于分組
summarise()
可以匯總計算平均值潜的、標準差骚揍、標準誤等等
> wb_group<-group_by(wb,wool,tension)
> wb_group
# A tibble: 54 x 3
# Groups: wool, tension [6]
breaks wool tension
<dbl> <fct> <fct>
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
<fct> <fct> <int> <dbl>
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