R语言数据处理——基于tidyverse (一)

子集的选取——基于tidyverse

    • 准备工作
    • 1 选取行子集
      • 1.1 slice :根据行特征选取行子集
      • 1.2 filter :按条件选取行子集
    • 2. 去除重复行
    • 3 选取列子集
    • the end

准备工作

(1)安装tidyverse,用于数据处理

install.packages("tidyverse")

(2)运用R及相关包库及帮助文件进行学习

?filter   # 查看filter帮助文件          
?slice    # 查看slice帮助文件
??select  # 查看select帮助文件,注意,范围过大

2.基础知识

管道操作
数据集经常需要选行子集、选列子集、排序、定义新变量、横向合并、长宽转换等操作,而且经常会用若干个连续的操作分步处理。magrittr包的管道运算符 %>% 实现这样的操作流程。

比如,变量 x 先用函数 f(x)进行变换,再用函数 g(x) 进行变换,一般应该写成 g(f(x)),用%>% 运算符,可以表示成 x %>% f() %>% g()。

再比如 h(g(f(x))) 可以写成 x %>% f() %>% g() %>% h()。这样的表达更符合处理发生的次序,而且插入一个处理步骤也很容易。

(1) %T% 运算符,x %T% f() 返回 x 本身而不是用 f() 修改后的返回值 f(x),这在中间步骤需要显示或者绘图但是需要进一步对输入数据进行处理时有用。

(2)%$%运算符,此运算符的作用是将左运算元的各个变量(这时左运算元是数据框或列表)暴露出来,可以直接在右边调用其中的变量,类似于 with() 函数的作用。

(3)%<>% 运算符,用在管道链的第一个连接,可以将处理结果存入最开始的变量中。

1 选取行子集

1.1 slice :根据行特征选取行子集

Usage

library(tidyverse)                                       #先载入tidyverse

slice_head() and slice_tail()                            #select the first or last rows.
slice_sample()                                           #randomly selects rows.
slice_min() and slice_max()                              #select rows with highest or lowest values of a variable.

slice(.data, ..., .preserve = FALSE)
slice_head(.data, ..., n, prop)
slice_tail(.data, ..., n, prop)
slice_min(.data, order_by, ..., n, prop, with_ties = TRUE)
slice_max(.data, order_by, ..., n, prop, with_ties = TRUE)
slice_sample(.data, ..., n, prop, weight_by = NULL, replace = FALSE)

Examples

mtcars %>% slice(1)                                     # 选mtcars的第1行
mtcars %>% slice(5)                                     # 选mtcars的第5行
mtcars %>% slice(n())                                   # 选mtcars的最后一行
mtcars %>% slice(1:5)                                   # 选mtcars的第1到5行
mtcars %>% slice(5:n())                                 # 选mtcars的第5到最后一行
mtcars %>% slice(-1:-5)                                 # -表示剔除,剔除1到5行
mtcars %>% slice -(1:10)                                # -表示剔除,剔除1到10行

# slice_min() & slice_max()
mtcars %>% slice_min(mpg, n = 5)                        # 按mpg排序,选mpg最小的5行
mtcars %>% slice_max(mpg, n = 2)                        # 按mpg排序,选mpg最大的2行
mtcars %>% slice_min(cyl, n = 1, with_ties = FALSE)     # 如有多个cyl=1的行,只展示第一行

# slice_head() & slice_tail()
mtcars %>% slice_head(n = 5)                            # 选前5行
mtcars %>% slice_tail(n = 5)                            # 选后5行

# slice_sample()                                        # 对数据进行随机抽烟
mtcars %>% slice_sample(n = 5)                          # 抽样5个,默认无放回抽样
mtcars %>% slice_sample(n = 5, replace = TRUE)          # 抽样5个,有放回抽

## 提示,sample_n 也可单独进行抽样,详情参考 ?sample_n

1.2 filter :按条件选取行子集

Usage

filter(.data, ..., .preserve = FALSE)

下列符号可被使用
==, >, >= etc
&, |, !, xor()
is.na()
between(), near()

Examples

# Filtering by one criterion
# 选取 species 是 Human 的行
filter(starwars, species == "Human") 

# 选取 mass 值大于 1000 的行                  
filter(starwars, mass > 1000)                          

# Filtering by multiple criteria
#选取 hair_color 为 none 且 eye_color 为 black 的行,& 与 , 同含义
filter(starwars, hair_color == "none" & eye_color == "black")
filter(starwars, hair_color == "none", eye_color == "black")

#选取 hair_color 为 none 或 eye_color 为 black 的行
filter(starwars, hair_color == "none" | eye_color == "black")

# 忽略缺失值,选取mass大于平均mass的行
starwars %>% filter(mass > mean(mass, na.rm = TRUE))

# 按性别分组,忽略缺失值,选取mass大于平均mass的行
starwars %>% group_by(gender) %>% filter(mass > mean(mass, na.rm = TRUE))

2. 去除重复行

Usage

distinct(.data, ..., .keep_all = FALSE)

Examples

# 继续使用 mtcars 数据,为相互比较,对去重的结果进行存储为m1,m2,m3,m4
# 去除 hp 列有重复值的行,仅保留一行
mtcars %>% distinct(hp)

m1 <- mtcars %>% distinct(hp)  
m2 <-  mtcars %>%
   distinct(hp, .keep_all = T)
# m1 只有 hp 列, m2 所有列都在

# 多列去重,只有多列不全重复,即为不重复

m3 <-  mtcars %>%
   distinct(hp, vs, .keep_all = T)

m4 <-  mtcars %>%
   distinct(hp,vs, gear, .keep_all = T)

# m3 去除 hp 列 和 vs 列 有重复值的行
# m4 去除 hp 列 和 vs 列 及 gear 列 有重复值的行

# 实际应用中,多用于对观测的ID去重,但要注意,虽ID相同,但其他变量值不同,如对同一对象进行多年跟踪调查

3 选取列子集

Usage

select(.data, ...)

Examples

#示例使用 starwars 数据
s  <- starwars
s1 <- starwars %>% select(height)
s2 <- starwars %>% select(height, mass)
s3 <- starwars %>% select(- height, -name, -mass)
s4 <- starwars %>% select(name:mass)
s5 <- starwars %>% select(!(name:mass))
s6 <- starwars %>% select(3:5)
# s 数据为starwars 数据
# s1 仅保留height 列
# s2 保留 height,  mass两列
# s3 保留 除了 height,  name,mass列的其他列
# s4 保留从 name 列起始。到 mass 列止 的所有列
# s5 使用 ! 符号, 表示 与s3 相反
# s6 保留第3到5列,
# 

#示例使用 iris数据,对 starts_with(起始是什么),end_with (终止是什么)进行操作
i <- iris
i1 <- iris %>% select(starts_with("Petal") & ends_with("Width")
i2 <- iris %>% select(starts_with("Petal") | ends_with("Width"))
i3 <- iris %>% select(!ends_with("Width"))
# i 数据为iris全体数据,i1 保留 列名 以 Petal 开头,且以 Width 结尾的 数据
# i2 保留 列名 以 Petal 开头,或以 Width 结尾的 数据
# i3 保留 除了 列名 以 Width 结尾  的所有数据

select() 有若干个配套函数可以按名字的模式选择变量列,如
• starts_with(“se”): 选择名字以 “se”‘开头的变量列;
• ends_with(“ght”): 选择名字以 “ght”‘结尾的变量列;
• contains(“no”): 选择名字中含有子串 “no”‘的变量列;
• matches("1+[[:digit:]]+$"),选择列名匹配某个正则表达式模式的变量列,这里匹配前一部分是字母,后一部分是数字的变量名,如 abc12;
• num_range(“x”, 1:3),选择 x1, x2, x3;
• everything(): 代指所有选中的变量,这可以用来将指定的变量次序提前,其它变量排在后面。

the end


  1. [:alpha:] ↩︎

你可能感兴趣的:(R语言,统计,数据,数据分析,r语言)