本教程描述如何根據(jù)特定的條件來提取數(shù)據(jù)框的行土涝。
在本教程中碧信,您將從dplyr包中學(xué)習(xí)以下R函數(shù):
slice(): 按位置提取行
filter(): 提取滿足特定邏輯條件的行。例如? ?iris %>% filter(Sepal.Length > 6).
filter_all(),?filter_if() and?filter_at(): 篩選選擇的變量中的行蓖谢。這些函數(shù)將邏輯標(biāo)準(zhǔn)復(fù)制到所有變量或一組變量上珍语。filter rows within a selection of variables. These functions replicate the logical criteria over all variables or a selection of variables.
sample_n(): 隨機(jī)選擇n行??
sample_frac(): 隨機(jī)選擇一部分行?
top_n(): 選擇按變量排序的前n行??
我們還將向您展示如何刪除給定列中有缺失值的行。
需要的R包
加載tidyverse包捏膨,其中包括dplyr包:
library(tidyverse)
示例數(shù)據(jù)
我們將使用R內(nèi)置的iris數(shù)據(jù)集,首先將其轉(zhuǎn)換為tibble數(shù)據(jù)框(tbl_df)食侮,以便于進(jìn)行數(shù)據(jù)分析号涯。
my_data <- as_tibble(iris)
my_data
按位置提取行
函數(shù): slice()?[dplyr package]
my_data %>% slice(1:6)
根據(jù)邏輯標(biāo)準(zhǔn)過濾行
函數(shù):?filter()?[dplyr package]. 用于過濾符合某些邏輯條件的行。
在繼續(xù)之前锯七,我們將介紹邏輯比較和運(yùn)算符链快,它們對于過濾數(shù)據(jù)非常重要。
邏輯比較
R中可用的“邏輯”比較運(yùn)算符有:
<: for less than
>: for greater than
<=: for less than or equal to
>=: for greater than or equal to
==: for equal to each other
!=: not equal to each other
%in%: 包含group membership. 例如, “value?%in%?c(2, 3)” 意思是value可以取2或者3
is.na(): is NA
!is.na(): is not NA.
邏輯運(yùn)算符
value == 2|3: means that the value equal 2 or (|) 3.?
value?%in%?c(2, 3) is a shortcut equivalent to value == 2|3.
&: means and. For example sex == “female” & age > 25
初學(xué)者在R中最常犯的錯(cuò)誤是在測試相等性時(shí)使用=而不是==眉尸。請記住域蜗,在測試是否相等時(shí),應(yīng)該始終使用== (not =)噪猾。
根據(jù)邏輯標(biāo)準(zhǔn)提取行
One-column based criteria: Extract rows where Sepal.Length > 7:
my_data %>% filter(Sepal.Length >7)
基于多列的標(biāo)準(zhǔn)Multiple-column based criteria: Extract rows where Sepal.Length > 6.7 and Sepal.Width ≤ 3:? ? 提取萼片長度> 6.7和萼片寬度≤3的行
my_data %>% filter(Sepal.Length >6.7, Sepal.Width <=3)
Test for equality?(==): Extract rows where Sepal.Length > 6.5 and Species = “versicolor”:
my_data %>% filter(Sepal.Length >6.7, Species =="versicolor")
Using OR operator?(|): Extract rows where Sepal.Length > 6.5 and (Species = “versicolor” or Species = “virginica”):
my_data %>% filter(? Sepal.Length >6.7,? Species =="versicolor"| Species =="virginica")
Or, equivalently, use this shortcut (%in%?operator):
my_data %>% filter(? Sepal.Length >6.7,? Species %in% c("versicolor","virginica")? )
Filter rows within a selection of variables篩選選擇的變量中的行
函數(shù)?filter_all(),?filter_if() and?filter_at() 用于篩選選擇的變量中的行
這些函數(shù)將邏輯標(biāo)準(zhǔn)復(fù)制到所有變量或一組變量上霉祸。
從my_data中刪除分組列“Species”,創(chuàng)建一個(gè)新的演示數(shù)據(jù)集:
my_data2 <- my_data %>% select(-Species)
選擇所有變量都大于2.4的行:
my_data2 %>% filter_all(all_vars(.>2.4))
選擇任一變量大于2.4的行:
my_data2 %>% filter_all(any_vars(.>2.4))
更改要應(yīng)用篩選條件的列的選擇袱蜡。filter_at()允許使用vars()規(guī)范丝蹭。下面的R代碼對?Sepal.Length 和 Sepal.Width列進(jìn)行篩選
my_data2 %>% filter_at(vars(starts_with("Sepal")), any_vars(. >2.4))
刪除缺失值
我們從創(chuàng)建一個(gè)包含缺失值的數(shù)據(jù)框開始。在R中用?NA(Not Available)?用來表示缺失值:
# Create a data frame with missing data
friends_data <- data_frame(? name = c("A","B","C","D"),? age = c(27,25,29,26),? height = c(180,NA,NA,169),? married = c("yes","yes","no","no"))
friends_data
提取高度為NA的行:
friends_data %>% filter(is.na(height))
排除(刪除)高度為NA的行:
friends_data %>% filter(!is.na(height))
?!is.na()?意思是? “非” NAs.
從數(shù)據(jù)框中隨機(jī)選擇行
可以使用 sample_n() 函數(shù)選擇n個(gè)隨機(jī)行坪蚁,也可以使用? sample_frac()? ?函數(shù)選擇隨機(jī)分?jǐn)?shù)的行奔穿。我們首先使用函數(shù)? set.seed()? ?來啟動隨機(jī)數(shù)生成器引擎。這對于用戶重現(xiàn)分析非常重要敏晤。
set.seed(1234)
# Extract 5 random rows without replacement
my_data %>% sample_n(5, replace =FALSE)
# Extract 5% of rows, randomly without replacement
my_data %>% sample_frac(0.05, replace =FALSE)
選擇按變量排序的前n行
#Select the top 5 rows ordered by Sepal.Length
my_data %>% top_n(5, Sepal.Length)
# 按 Species 分組贱田,按Sepal.Length順序選擇每組前5位
my_data %>%? group_by(Species) %>%? top_n(5, Sepal.Length)
## # A tibble: 16 x 5
## # Groups:? Species [3]
##? Sepal.Length Sepal.Width Petal.Length Petal.Width Species?
##? ? ? ? ? <dbl>? ? ? <dbl>? ? ? ? <dbl>? ? ? <dbl> <fct>? ?
## 1? ? ? ? ? 5.8? ? ? ? 4? ? ? ? ? ? 1.2? ? ? ? 0.2 setosa? ?
## 2? ? ? ? ? 5.7? ? ? ? 4.4? ? ? ? ? 1.5? ? ? ? 0.4 setosa? ?
## 3? ? ? ? ? 5.7? ? ? ? 3.8? ? ? ? ? 1.7? ? ? ? 0.3 setosa? ?
## 4? ? ? ? ? 5.5? ? ? ? 4.2? ? ? ? ? 1.4? ? ? ? 0.2 setosa? ?
## 5? ? ? ? ? 5.5? ? ? ? 3.5? ? ? ? ? 1.3? ? ? ? 0.2 setosa? ?
## 6? ? ? ? ? 7? ? ? ? ? 3.2? ? ? ? ? 4.7? ? ? ? 1.4 versicolor
## # ... with 10 more rows
總結(jié)
本教程中,我們介紹了如何使用 dplyr 包過濾數(shù)據(jù)框的行:
使用邏輯標(biāo)準(zhǔn)過濾行:?my_data %>% filter(Sepal.Length >7)
隨機(jī)選擇N行:?my_data %>% sample_n(10)
隨機(jī)選擇一定比例的行:?my_data %>% sample_frac(0.1)
按某變量選擇前n行:?my_data %>% top_n(10, Sepal.Length)
按?Species?分組嘴脾,再選擇每組中Sepal.Length順序前5位:
my_data %>%? group_by(Species) %>%? top_n(5, Sepal.Length)