【发布时间】:2020-05-23 08:13:18
【问题描述】:
以下是我在 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"
【问题讨论】:
-
嗨!如果在 mutate 中这样,我不会使用。为什么不坚持使用 ifelse 甚至更好的 case_when()?此外,您的示例不可重现,您正在使用 startdate 和 enddate 但它们不在您的 df 中。
-
但我认为 ifelse 只能在 2 个条件下使用。我有 4 个条件。
-
您可以在 ifelse 中使用 ifelse,但这很丑陋/不可取。这就是为什么我会建议 case_when
SD = case_when(Date <= start_date & Date + 365 >= end_date ~1 , Date + 365 <= start_date | Date >= end_date ~0, Date <= start_date & Date + 365 <= end_date ~(Date + 365 - start_date + 1)/period, Date >= start_date & Date + 365 >= end_date~ (end_date - Date + 1)/period))但由于您的示例不起作用(它没有开始或结束日期),我无法为您提供正确的代码
标签: r if-statement dplyr