首页 > 解决方案 > 警告消息:条件的长度 > 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"

标签: rif-statementdplyr

解决方案


这是一个解决方案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虽然可能是更具可读性的选项。


推荐阅读