R 语言中具有多条件的矢量 if 函数

您所在的位置:网站首页 mod函数和mid函数的使用方法 R 语言中具有多条件的矢量 if 函数

R 语言中具有多条件的矢量 if 函数

#R 语言中具有多条件的矢量 if 函数| 来源: 网络整理| 查看: 265

当前位置:主页 > 学无止境 > 编程语言 > Python PHP Java Go TypeScript C++ Vba Node.js C语言 R 语言中具有多条件的矢量 if 函数 作者:迹忆客 最近更新:2023/03/21 浏览次数:

常见的数据分析任务是基于同一行的其他列使用一个或多个条件创建或更新数据框列。

如果我们尝试使用 if 语句执行此操作,则仅使用第一行来测试条件,并根据该行更新整个列。

使用数据框时,我们需要适用于多行的工具和技术。本文将学习向量化的 if 函数和向量化的 AND 和 OR 运算符来组合多个条件。

我们将首先创建一个小的数据框来进行说明。

# Create two vectors. Col1 = rep(c("A", "B"), times = 2, each = 2) Col2 = rep(c("x", "y"), times = 1, each = 4) # Create a data frame. cond_df = data.frame(Col1, Col2) # View the data frame. cond_df R 中 if 语句的限制

根据文档,if 语句采用非 NA 的长度为一的逻辑向量 ….仅使用第一个元素。

在以下示例中,我们将根据使用另一列的条件创建一列。

# Try to use the if statement. cond_df$NewCol = if(Col1 == "B"){cond_df$NewCol = "Col1 was B"} else{cond_df$NewCol = "Col1 was not B"} # View the result. cond_df

输出:

Col1 Col2 NewCol 1 A x Col1 was not B 2 A x Col1 was not B 3 B x Col1 was not B 4 B x Col1 was not B 5 A y Col1 was not B 6 A y Col1 was not B 7 B y Col1 was not B 8 B y Col1 was not B

当我们执行这个 if 语句但创建列时,R 发出警告。结果不是我们想要的。

仅评估第一行,并将结果应用于所有数据框行。

R 中的向量化 ifelse() 函数

Base R 包含一个向量化的 ifelse() 函数,我们可以使用它来有条件地更新数据框列。

根据文档,此函数 ...返回一个与 test...具有相同形状的值,这使其适合在数据帧上使用。

该函数的语法是:ifelse(test, value_if_true, value_if_false)。下面的代码说明了这个函数的使用。

# Create a new data frame using the same vectors. vect_df = data.frame(Col1, Col2) # Use the vectorized ifelse() function. vect_df$NewCol = ifelse(Col1 == "B", "Col1 was B", "F") # view the result. vect_df

输出:

> vect_df Col1 Col2 NewCol 1 A x F 2 A x F 3 B x Col1 was B 4 B x Col1 was B 5 A y F 6 A y F 7 B y Col1 was B 8 B y Col1 was B

这个函数按预期工作。我们可以使用它使用基于其他列的值的条件来创建或更新数据框列。

但是这个函数有一个限制。文档说明 ifelse() 会去除属性。这在使用日期和因素时很重要。

让我们看一个问题的例子,它们是:

创建一个日期向量。 在第一个向量上使用 ifelse() 函数创建一个新向量。ifelse() 函数引起的变化是意料之外的。 # Create and view a vector of dates. datevec = seq(from = as.Date("2022-01-01"), to = as.Date("2022-01-05"), by = "day") datevec class(datevec) # Create a new vector of dates using the ifelse() function on the previous vector. View it. mod_datevec = ifelse(datevec datevec = seq(from = as.Date("2022-01-01"), to = as.Date("2022-01-05"), by = "day") > datevec [1] "2022-01-01" "2022-01-02" "2022-01-03" "2022-01-04" "2022-01-05" > class(datevec) [1] "Date" > > mod_datevec = ifelse(datevec < as.Date("2022-01-03"), datevec, as.Date("2022-02-01")) > mod_datevec [1] 18993 18994 19024 19024 19024 > class(mod_datevec) [1] "numeric"

我们发现日期已更改为数字。ifelse() 函数在日期和因子变量上无法按预期工作。

现在让我们看看 dplyr 包提供的解决方案。

R 中 dplyr 包的 if_else() 函数

dplyr 包中的 if_else() 函数解决了与基本 R 的 ifelse() 函数相关的一些问题。

它确保 value_if_true 和 value_if_false 属于同一类型。 它从 value_if_true 获取所有其他属性。

让我们以这个函数为例。

# First load the dplyr package. library(dplyr) # Create another data frame from the two vectors. dplyr_df = data.frame(Col1, Col2) # Use the vectorized if_else() function. dplyr_df$NewCol = if_else(Col1 == "B", "Col1 was B", "F") # view the result. dplyr_df

我们可以检查输出并查看函数是否按预期工作,就像基本 R 的 ifelse()。

它在日期上是如何工作的呢?让我们来检查一下。

# Create a new vector using if_else() based on the vector created earlier. View it. dplyr_datevec = if_else(datevec dplyr_datevec = if_else(datevec < as.Date("2022-01-03"), datevec, as.Date(NA)) > dplyr_datevec [1] "2022-01-01" "2022-01-02" NA NA NA

我们发现 dplyr 和 if_else() 函数在日期上正常工作。

在 R 中的 if_else() 函数中使用多个条件

我们可以使用向量化的&和|组合多个条件运算符,代表 AND 和 OR。

这些可以在 ifelse() 和 if_else() 中使用。在我们的示例中,我们将使用 if_else(),因为它更好。

# Create a data frame from the same two vectors. mult_df = data.frame(Col1, Col2) # Create a new column based on multiple conditions combined with AND, using &. mult_df$AND_Col = if_else((Col1 == "A" & Col2 == "y"), "AND", "F") # View the data frame with the added column. mult_df # Create another column based on multiple conditions combined with Or, using |. mult_df$OR_Col = if_else((Col1 == "A" | Col2 == "y"), "OR", "F") # View the data frame with the added column. mult_df

最后一条命令的输出:

> mult_df Col1 Col2 AND_Col OR_Col 1 A x F OR 2 A x F OR 3 B x F F 4 B x F F 5 A y AND OR 6 A y AND OR 7 B y F OR 8 B y F OR

请记住,R 具有向量化和非向量化版本的 AND 和 OR 运算符。我们使用了向量化的&和|运算符来组合两个条件,因为我们想测试每一行的条件。

& 和 |被矢量化; && 和 ||是非矢量化的。

参考资料和帮助:

在 R Studio 中,有关 if 语句、ifelse() 函数或 if_else() 函数的更多信息,请单击 Help > Search R Help 并在搜索框中键入不带括号的语句/函数名称。

或者,在 R 控制台的命令提示符处键入一个问号,后跟语句/函数名称。

结论

使用单个变量的语句、函数和运算符可能不适用于数据框。我们需要使用适当的工具来完成任务。

为了有条件地创建/更新数据框的列,我们使用了向量化的 ifelse() 函数及其更好的 dplyr 版本 if_else()。

我们使用向量化的 AND 和 OR 运算符来组合多个条件&和|。

上一篇:R 数据框的选定列的总和

下一篇:从 R 中的工作区中删除用户定义的对象

相关文章 R 中具有多个条件的函数向量化

发布时间:2023/03/21 浏览次数:62 分类:编程语言

一项常见的数据分析任务是根据同一行的其他列使用一个或多个条件创建或更新数据框列。 如果我们尝试使用 if 语句来执行此操作,则只会使用第一行来测试条件,并且会根据该行更

在 R 中读取 xlsx 文件

发布时间:2023/03/21 浏览次数:56 分类:编程语言

在这篇文章中,你将会了解到两个在 R 中读取 xlsx 文件的最完整和最容易使用的库:readxl 和 openxlsx。

清理 R 的环境

发布时间:2023/03/21 浏览次数:172 分类:编程语言

在本教程中,你将学习如何在 R 中编写一个函数,在不需要重新启动 R 的情况下清除环境。

检查 R 的版本

发布时间:2023/03/21 浏览次数:104 分类:编程语言

本教程演示了如何检查 R 的版本。

在 R 中创建空向量

发布时间:2023/03/21 浏览次数:175 分类:编程语言

本教程演示了如何在 R 中创建一个空向量。

查找 R 向量中元素的索引

发布时间:2023/03/21 浏览次数:137 分类:编程语言

本教程演示了如何在 R 向量中查找元素的索引。

R 中计算标准误差

发布时间:2023/03/21 浏览次数:190 分类:编程语言

本教程演示了如何在 R 中计算标准误差。

在 R 中注释掉多行

发布时间:2023/03/21 浏览次数:55 分类:编程语言

在本文中,你将学习如何在 R 中注释出多行,而不必在每一行的开头手动写一个#字符来注释。

在 R 中清除内存

发布时间:2023/03/21 浏览次数:190 分类:编程语言

在本教程中,你将学习如何清除 R 系统占用的内存,而不必重新启动它或重新启动它运行的计算机。

转载请发邮件至 [email protected] 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3