R中选择数据框的行

本教程描述如何根据特定的条件来提取数据框的行。

在本教程中,您将从dplyr包中学习以下R函数:

slice(): 按位置提取行

filter(): 提取满足特定逻辑条件的行。例如   iris %>% filter(Sepal.Length > 6).

filter_all(), filter_if() and filter_at(): 筛选选择的变量中的行。这些函数将逻辑标准复制到所有变量或一组变量上。filter rows within a selection of variables. These functions replicate the logical criteria over all variables or a selection of variables.

sample_n(): 随机选择n行  

sample_frac(): 随机选择一部分行 

top_n(): 选择按变量排序的前n行  

我们还将向您展示如何删除给定列中有缺失值的行。

需要的R包

加载tidyverse包,其中包括dplyr包:

library(tidyverse)

示例数据

我们将使用R内置的iris数据集,首先将其转换为tibble数据框(tbl_df),以便于进行数据分析。

my_data <- as_tibble(iris)

my_data

按位置提取行

函数: slice() [dplyr package]

my_data %>% slice(1:6)

根据逻辑标准过滤行

函数: filter() [dplyr package]. 用于过滤符合某些逻辑条件的行。

在继续之前,我们将介绍逻辑比较和运算符,它们对于过滤数据非常重要。

逻辑比较

R中可用的“逻辑”比较运算符有:

<: 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.

逻辑运算符

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

初学者在R中最常犯的错误是在测试相等性时使用=而不是==。请记住,在测试是否相等时,应该始终使用== (not =)。

根据逻辑标准提取行

One-column based criteria: Extract rows where Sepal.Length > 7:

my_data %>% filter(Sepal.Length >7)


基于多列的标准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筛选选择的变量中的行

函数 filter_all(), filter_if() and filter_at() 用于筛选选择的变量中的行

这些函数将逻辑标准复制到所有变量或一组变量上。

从my_data中删除分组列“Species”,创建一个新的演示数据集:

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))

更改要应用筛选条件的列的选择。filter_at()允许使用vars()规范。下面的R代码对 Sepal.Length 和 Sepal.Width列进行筛选

my_data2 %>% filter_at(vars(starts_with("Sepal")), any_vars(. >2.4))

删除缺失值

我们从创建一个包含缺失值的数据框开始。在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"))

# Print

friends_data

提取高度为NA的行:

friends_data %>% filter(is.na(height))

排除(删除)高度为NA的行:

friends_data %>% filter(!is.na(height))

 !is.na() 意思是  “非” NAs.

从数据框中随机选择行

可以使用 sample_n() 函数选择n个随机行,也可以使用  sample_frac()   函数选择随机分数的行。我们首先使用函数  set.seed()   来启动随机数生成器引擎。这对于用户重现分析非常重要。

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

总结

本教程中,我们介绍了如何使用 dplyr 包过滤数据框的行:

使用逻辑标准过滤行: my_data %>% filter(Sepal.Length >7)

随机选择N行: my_data %>% sample_n(10)

随机选择一定比例的行: 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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容