r - ifelse() 和 if else 在 dplyr mutate() 中为时间变量给出不同的结果
问题描述
假设一个这样的data.frame:
df <- read.table(text = "ID Date Condition
1 2015/01/01 Yes
1 2015/01/10 No
1 2015/01/15 Yes
2 2015/02/10 No
2 2015/03/08 No
3 2015/01/01 No
3 2015/04/01 Yes
3 2015/04/10 No
3 2015/04/01 Yes
3 2015/04/10 No", header = TRUE)
我想分别计算每个 ID 的给定日期和第一个日期之间的天数。现在,对于条件始终为“否”的每个 ID,我想在结果列中分配 NA。
这是我的代码:
df %>%
mutate(Date = as.Date(Date, "%Y/%m/%d")) %>%
group_by(ID) %>%
mutate(Temp = Date - first(Date),
Res1 = ifelse(all(Condition == "No"), NA, Temp),
Res2 = if(all(Condition == "No")) NA else Temp)
结果:
ID Date Condition Temp Res1 Res2
<int> <date> <fct> <time> <dbl> <time>
1 1 2015-01-01 Yes 0 0. 0
2 1 2015-01-10 No 9 0. 9
3 1 2015-01-15 Yes 14 0. 14
4 2 2015-02-10 No 0 NA <NA>
5 2 2015-03-08 No 26 NA <NA>
6 3 2015-01-01 No 0 0. 0
7 3 2015-04-01 Yes 90 0. 90
8 3 2015-04-10 No 99 0. 99
9 3 2015-04-01 Yes 90 0. 90
10 3 2015-04-10 No 99 0. 99
我的问题是, ifelse() 给出错误结果的原因是什么,而 if else() 给出了预期的结果?
解决方案
显然,你不明白ifelse
。if
它与和根本不同else
。文档清楚地说明“返回一个与“在您的示例中是长度为 1 的向量”ifelse
形状相同的值。然后回收这个。test
mutate
这是一个简单的例子:
all(c(TRUE, TRUE))
#[1] TRUE
ifelse(all(c(TRUE, TRUE)), 1:2, 3:4) #test is vector of length 1
#[1] 1
ifelse(c(TRUE, FALSE), 1:2, 3:4) #test is vector of length 2
#[1] 1 4
我鼓励您研究该ifelse
函数的源代码,这应该可以清楚地说明它为什么会这样。
推荐阅读
- api - 如果应用程序支持多客户端登录,如何将客户端 ID 和客户端密码传递给应用程序端(移动应用程序、Web 应用程序)
- android - 我无法获取访问令牌来访问 Reddit API
- python - 打印语句在我的文件管理系统中没有响应
- xml - 使用powershell中的xpath选择xml中元素的值
- javascript - 角度应用程序在 angular.json 脚本中找不到依赖项
- azure - 托管在 .net 核心中的 azure 上的应用程序显示无效的 dateTime.utcNow
- ios - Swift 中纵向和横向模式下的 UITabBar 对齐问题?
- amazon-web-services - AWS Lambda - amazon.com 之外的编辑功能
- javascript - 使用 lodash 过滤对象
- excel - 不增加行