千家信息网

R语言中怎么使用dplyr软件包来清理和转换数据

发表于:2024-10-22 作者:千家信息网编辑
千家信息网最后更新 2024年10月22日,这篇文章主要介绍"R语言中怎么使用dplyr软件包来清理和转换数据"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"R语言中怎么使用dplyr软件包来清理和转换数
千家信息网最后更新 2024年10月22日R语言中怎么使用dplyr软件包来清理和转换数据

这篇文章主要介绍"R语言中怎么使用dplyr软件包来清理和转换数据"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"R语言中怎么使用dplyr软件包来清理和转换数据"文章能帮助大家解决问题。

dplyr软件包是R中功能最强大,最受欢迎的软件包之一。该软件包由最受欢迎的R程序员Hadley Wickham编写,他编写了许多有用的R软件包,如ggplot2,tidyr等。

什么是dplyr?

dplyr是一个强大的R软件包,用于处理,清理和汇总非结构化数据。简而言之,它使得R中的数据探索和数据操作变得简单快捷。

dplyr有什么特别之处?

软件包"dplyr"包含许多主要使用的数据操作功能,例如应用过滤器,选择特定列,排序数据,添加或删除列以及聚合数据。这个包的另一个最重要的优点是学习和使用dplyr函数非常容易。也很容易回想起这些功能。例如,filter()用于过滤行。dplyr函数处理速度比基本R函数快。 这是因为dplyr函数是以计算有效的方式编写的。 它们在语法上也更稳定,并且比向量更好地支持数据帧。以下是该包中的方法与用途:

dplyr FunctionDescriptionEquivalent SQL
select()Selecting columns (variables)SELECT
filter()Filter (subset) rows.WHERE
group_by()Group the dataGROUP BY
summarise()Summarise (or aggregate) data-
arrange()Sort the dataORDER BY
join()Joining data frames (tables)JOIN
mutate()Creating New VariablesCOLUMN ALIAS

dplyr中主要方法的使用

filter系列:筛选出自己想要的数据

#安装与加载包#直接使用内置的iris、mtcars数据集来演示#iris数据集中,筛选Species为"setosa",并且Sepal.Length大于5的样本#"&"也可以替换成","> filter(iris, Species == "setosa" & Sepal.Length >= 5.5)  Sepal.Length Sepal.Width Petal.Length Petal.Width Species1          5.8         4.0          1.2         0.2  setosa2          5.7         4.4          1.5         0.4  setosa3          5.7         3.8          1.7         0.3  setosa4          5.5         4.2          1.4         0.2  setosa5          5.5         3.5          1.3         0.2  setosa

filter支持以下几种判断形式:

  1. 关系类型:<、 <= 、 >、 >=、==、!=、is.na()、 !is.na()

  2. &、 |、 !、 xor() #针对向量集的操作判断

  3. between()、%in%、 near() #sqrt(2) ^ 2 == 2 返回FALSE,near(sqrt(2) ^ 2, 2)则TRUE

  4. all_vars()、any_vars() #出现于filter_all、filter_at、filter_if中,作为判断条件

filter系列,还有几个变异函数:filter_all、filter_at、filter_if

#筛选任何变量>150的样本filter_all(mtcars, any_vars(. > 150)) #筛选变量以"d"结尾,并且变量 "%%2" 等于0filter_at(mtcars, vars(starts_with("d")), any_vars((. %% 2) == 0)) # 筛选变量向下取整 == 原变量数值, 并且这部分变量的数值!= 0 的样本集filter_if(mtcars, ~ all(floor(.) == .), all_vars(. != 0))

更多用法:

mtcars %>% filter_all(all_vars(.>150)) %>% head() # 筛选所有变量均大于150的行,结果为空mtcars %>% filter_all(any_vars(.>150)) %>% head() # 筛选存在变量大于150的行,# 针对变量名称为d开头的所有列,筛选存在变量能整除2的所有行mtcars %>% filter_at(vars(starts_with("d")), any_vars((.%% 2) == 0)) # 针对变量全为整数的列,筛选所有变量非0的所有行mtcars %>% filter_if(~all(floor(.) == .), all_vars(.!= 0)) # 支持purrr语法筛选mtcars %>% filter_at(vars(hp, vs), ~ .%% 2 == 0) # 筛选hp和vs变量都是偶数的所有行

select 函数:仅保留你所需要的列,并支持修改变量名称

用法:select(.data, …)

与之前讲解的filter有所不同,select是筛选变量的,而filter是筛选样本集。

应用场景:假设数据存于宽表中(比如有100个变量的表),而你仅需要其中几个变量。而select的关键在于"…"的判断条件

 #mtcars数据集中,筛选mpg、cyl、wt、vs,4个变量数据# mtcars[,c("mpg","cyl","wt","vs")],可以实现相同的功能 >select(mtcars,c("mpg","cyl","wt","vs"))  mpg cyl    wt vs 21.0   6 2.620  0 21.0   6 2.875  0 22.8   4 2.320  1# Tips:select 同样支持":"与"-"操作# 比如:select(mtcars,c("mpg":"vs"))、表示连续的列选择#      select(mtcars,-"mpg") 删除mpg列

以上给人感觉,不通过select,利用数据框与向量操作,同样可以做到,select 真正强大的地方在于,支持以下几种条件判断:

包含关系:starts_with()、 ends_with()、 one_of()

匹配关系:matches()、contains()、num_range()

# 包含关系:在Iris中,筛选以Petal开头,或Width结尾的变量>select(iris, starts_with("Petal"), ends_with("Width"))#   Petal.Length Petal.Width Sepal.Width#         1.4         0.2         3.5#         1.4         0.2         3.0#         1.3         0.2         3.2# ...(数据省略)# Tips:starts_with("Petal"), ends_with("Width"),2个条件不是 "且" 的关系,而是 "或"   # 包含关系:经常需要提取变化的数据集合,利用one_of再合适不过了# 提取mtcars中,"mpg","cyl","wt","vs" ,"vss" >var1 <- c("mpg","cyl","wt","vs","vss") >select (mtcars, one_of(var1))# mpg cyl    wt vs# 21.0   6 2.620  0# 21.0   6 2.875  0# 2.8   4 2.320  1# ...(省略数据)# Warning message: Unknown columns: `vss` # Tips: select没找到额变量,系统会返回警告# 匹配关系:筛选Iris数据集,变量名中带有"wid"的变量名>select(iris, matches(".wid."))>select(iris, contains("wid"))#   Sepal.Width Petal.Width#        3.5         0.2#        3.0         0.2# num_range能高效匹配变量名称类似x01, x02, x03的# 随机数据框,由X1~X5,y 组成:df <- data.frame(x1= runif(10), x2= runif(10),                    x3= runif(10), x4= runif(10),                      x5= runif(10), y= letters[1:10])# 筛选 y, x1:x3的变量,并且把y重命名为 var1>select(df, c(var1 = "y", num_range("x", 1:3)))#  var1  x1         x2        x3#  a 0.96631605 0.29815009 0.6545414#  b 0.61046600 0.76547552 0.8247191#  c 0.70510879 0.46636723 0.4472588# ... (数据省略)

mutate系列:对数据进行计算产生新数据

用法:mutate(.data, …)

mutate的使用方式,主要是依靠"…"的公式变化,生成新的变量

mutate支持以下几种公式 :

  1. +、-、*、÷ 、%%、%|% 等常用计算方式

  2. lead()、 lag()

  3. dense_rank(), min_rank(), percent_rank(), row_number(), cume_dist(), ntile()

  4. cumsum(), cummean(), cummin(), cummax(), cumany(), cumall()

  5. na_if(), coalesce()

  6. if_else(), recode(), case_when()

先从"rank"系列开始介绍,这一函数类,主要是用来划分名次、等级、百分比、密度等等

#############简单的+、-、*、÷ 、%%、%|%   可以增加新的数据列 >mutate(mtcars,aa=hp-drat,bb=mpg*cyl)    mpg cyl  disp  hp drat    wt  qsec vs am gear carb     aa    bb1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 106.10 126.02  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4 106.10 126.03  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1  89.15  91.24  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1 106.92 128.45  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2 171.85 149.66  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1 102.24 108.67  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4 241.79 114.4#######如果只想保留这些新的变量可以:> transmute(mtcars,aa=hp-drat,bb=mpg*cyl)       aa    bb1  106.10 126.02  106.10 126.03   89.15  91.24  106.92 128.45  171.85 149.66  102.24 108.6##########percent_rank,按照[0,1]百分比的形式进行排序# 举例说明,按照x的数值,按照百分比进行划分x <- c(5, 1, 3, 2, 4)percent_rank(x)# [1] 1.00 0.00 0.50 0.25 0.75# 这类函数比较适用于 ,需要排名次的场景。比如考试、比赛...#  比如根据iris中的Sepal.Length,进行百分比表示, 其中 %>% 管道的标识符,select函数中,everything()可以用来更换变量顺序 >iris %>% mutate(Length_rank = percent_rank(Sepal.Length)) %>% select(Length_rank,everything()) #   Length_rank Sepal.Length Sepal.Width Petal.Length Petal.Width Species#   0.21476510          5.1         3.5          1.4         0.2  setosa#   0.10738255          4.9         3.0          1.4         0.2  setosa#   ...(数据省略)# row_number(),不仅可以用来对想来排序,也可以表示获取行数mutate(mtcars, row_number() == 1L) # 新生成的变量,用来判断是否是第一行,返回TRUE 或者 FALSE    mtcars %>% filter(between(row_number(), 1, 10)) # 通过row_number,筛选1-10行.有点类似 top_n(10)# ntile,切割数据集为N块,返回具体的数值,属于等分切割ntile(runif(10), 5)# [1] 1 2 4 5 5 3 4 2 3 1# 某种程度上,ntile可以用来划分训练集和测试集(类似sample函数) # ind <- sample(2, nrow(mtcars), replace = TRUE, prob = c(0.8,0.2))# mtcars[ind == 1,]# 备注:ntile对数据框使用的时候,如果没有特殊标明具体的数据列,ntile会对所有的列进行切割操作

再说一下"cum"函数系列,这类函数计算累积指标,比如截止到某一天的平均值、总和、乘积等等。

# cumsum,累积相加的数值cumsum(1:10)# 1  3  6 10 15 21 28 36 45 55# 原数据集有N个,返回也是N个# 类似MS_SQL中的sum(s)over(order by y)# cumany(), cumall(),则是逻辑判断,并非计算数值cumall(-5:5)# TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE# 返回的是逻辑值,0代表FALSE

最后说一下"判断"函数系列,这类函数应用比较广泛。

比如生活中,当天空下雨了,小明就打伞了

类似EXCEL中的 if函数,vlookup函数等等

# if_else# 用法:if_else(condition, true, false, missing = NULL),比传统的ifelse多了一个missing参数# 并且if_else能保留原数据的数据类型,不会降维操作# 假设x >= 0,则 y-1,y < 0 的情况下, y + 1 df <- data.frame(x = c(-5:4), y = runif(10))df %>% mutate( xy = if_else(x >= 0, y -1, y+1, y))#     x         y         xy#   -5    0.7760150  1.7760150#   -4    0.9310976  1.9310976# case_when中,判断的条件可以更加的多样化# case_when,与SQL中的case...when...一样# 同C语言中的switch一样   x <- c(1:10,NA)case_when(  x %% 2 == 0 ~ "偶",  x %% 2 == 1 ~ "奇",  TRUE ~ as.character(x)     #可以设置一个默认值)  "奇" "偶" "奇" "偶" "奇" "偶" "奇" "偶" "奇" "偶" NA

arrange 用于数据排序

arrange() 函数以行为单位进行排序,默认为升序排列,降序使用 desc( ) 函数。第一个参数为数据集名称,后面为排序依据变量。

> arrange(mtcars,hp,mpg,cyl )    mpg cyl  disp  hp drat    wt  qsec vs am gear carb1  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    22  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    23  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    14  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    15  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    16  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    27  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    18  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    29  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    110 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1

多列排序,降序用desc()

> arrange(mtcars,desc(hp),mpg,cyl )    mpg cyl  disp  hp drat    wt  qsec vs am gear carb1  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    82  15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    43  13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    44  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    45  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    46  10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    47  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    48  15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    39  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    310 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3

sample_n() and sample_frac()按行随机选取数据子集

sample_n() and sample_frac() 分别是按固定多少行随机选取,一个是按行数的比例选取;

> sample_n(mtcars,10)    mpg cyl  disp  hp drat    wt  qsec vs am gear carb1  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    22  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    43  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    14  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    15  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    26  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    47  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    48  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    19  15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    410 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2> sample_frac(mtcars,0.1)   mpg cyl disp  hp drat   wt  qsec vs am gear carb1 10.4   8  472 205 2.93 5.25 17.98  0  0    3    42 14.3   8  360 245 3.21 3.57 15.84  0  0    3    43 13.3   8  350 245 3.73 3.84 15.41  0  0    3    4

%>% 数据管道综合运用举例

data(iris)data(mtcars)iris %>% head()mtcars %>% head()# 筛选变量名为字符串开头的变量iris %>% select(starts_with("Sepal")) %>% head() # 多个筛选条件iris %>% select(-starts_with("Sepal")) %>% head() # 筛选变量名为字符串结尾的变量iris %>% select(ends_with("Length")) %>% head() iris %>% select(-ends_with("Length")) %>% head()# 将变量Species移动到最前面iris %>% select(Species, everything()) %>% head()# 反筛选,筛选除了Sepal.Length变量的其它变量iris %>% select(-Sepal.Length) %>%head() # 将变量Species移动到最后面iris %>% select(everything(), Species) %>% head()iris %>% select(-Species, Species) %>% head()# 错误的用法,结果为空iris %>% select(Species, -Species) %>% head() iris %>% select(contains("etal")) %>% head()iris %>% select(matches(".t.")) %>% head() # 筛选名称中,t在中间的变量。  iris %>% select(last_col()) %>% head()# 最后一个变量iris %>% select(last_col(offset = 2)) %>% head() # 倒数第3个变量iris %>% select(one_of(c("Petal.Length", "Petal.Width"))) %>% head()iris %>% group_by(Species) %>% select(group_cols()) %>% distinct() %>% head() # 获取分组变量名df <- as.data.frame(matrix(runif(100), nrow = 10)) %>% as_tibble()head(df)df %>% select(V4:V7) %>% head() # 筛选V4列到V7列df %>% select(num_range("V", 4:7)) %>% head() # 结果与前面一样#列名重命名iris %>% select(petal_length = Petal.Length) %>% head() # 重命名iris %>% select(obs = starts_with('S')) %>% head() # 多个变量重命名

关于"R语言中怎么使用dplyr软件包来清理和转换数据"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0