r - 警告消息:条件的长度 > 1,并且只会使用第一个元素
问题描述
下面是我在 R 中的代码。我使用 dplyr 包按 ID 和日期排列数据,并尝试使用 mutate() 创建新列 SD。在 SD 列中,SD 列中的结果有一些标准,因此我使用了 if() 和 if else() 函数,但有警告消息。
library(dplyr)
ID<-c("A01","A02","A03","A01","A01","A03","A02")
SA<-c(50,100,50,100,150,100,20)
a<-c("01/01/2012","01/01/2011","01/01/2012","01/01/2011","01/01/2013","01/01/2013","01/01/2012")
Date<-as.Date(a, format = "%d/%m/%Y")
df <- data.frame(ID,Date,SA)
start_date = as.Date("01/01/2012", format = "%d/%m/%Y")
end_date = as.Date("31/03/2012", format = "%d/%m/%Y")
df %>%
arrange(ID,Date) %>%
group_by(ID) %>%
mutate(start_date=start_date,
end_date=end_date,
period=as.numeric(end_date - start_date + 1),
SD = if(Date <= start_date & Date + 365 >= end_date) {1}
else if(Date + 365 <= start_date | Date >= end_date) {0}
else if(Date <= start_date & Date + 365 <= end_date) {(Date + 365 - start_date + 1)/period}
else if(Date >= start_date & Date + 365 >= end_date) {(end_date - Date + 1)/period})
但是,有如下警告消息。我该如何解决这个问题?
"Warning messages:
1: In if (Date <= start_date & Date + 365 >= end_date) { :
the condition has length > 1 and only the first element will be used
2: In if (Date + 365 <= start_date | Date >= end_date) { :
the condition has length > 1 and only the first element will be used
3: In if (Date <= start_date & Date + 365 >= end_date) { :
the condition has length > 1 and only the first element will be used
4: In if (Date + 365 <= start_date | Date >= end_date) { :
the condition has length > 1 and only the first element will be used
5: In if (Date <= start_date & Date + 365 >= end_date) { :
the condition has length > 1 and only the first element will be used"
解决方案
这是一个解决方案ifelse
df %>%
arrange(ID,Date) %>%
group_by(ID) %>%
mutate(start_date=start_date,
end_date=end_date,
period=as.numeric(end_date - start_date + 1),
SD = ifelse(Date <= start_date & Date + 365 >= end_date,
1,
ifelse(Date + 365 <= start_date | Date >= end_date,
0,
ifelse(Date <= start_date & Date + 365 <= end_date,
(Date + 365 - start_date + 1)/period,
(end_date - Date + 1)/period)))
)
ifelse
有 3 个条目,条件,在条件 ==TRUE 时发生的情况以及在条件 ==FALSE 时发生的情况。您可以链接ifelse
命令来检查多个条件,就像我在这里所做的那样。
case_when
虽然可能是更具可读性的选项。
推荐阅读
- c# - Unity3D - 构建失败,因为“[Unity] 错误:资产标记为 HideFlags.DontSave 但包含在构建中:”
- spring-cloud - 假装客户端'readTimeout'与hystrix.execution.isolation.thread.timeoutInMilliseconds的配置之间是否有任何关系
- c++ - 如何在与 LUA 脚本一起使用的 lambda 中引用“this”
- python - 如何使用 pytest monkeypatch 修补一个类
- windows - 如何检测 LE(线性可执行文件)文件的架构?
- python - 迭代 Keras 自定义损失函数
- d3.js - d3 同步 2 个单独的缩放行为
- php - 获取所有 WooCommerce 订单项目以在变量中使用
- python - 如何读取此文本文件中的两列数据?
- python-3.x - 我如何将一个整数附加到我的机器人的一行?