R-根据条件在数据帧中创建新列

R-根据条件在数据帧中创建新列,r,if-statement,dataframe,R,If Statement,Dataframe,我需要在数据框中创建一个列,其中包含一个yr字符串,该字符串将自动将每个yr标识为“leap”或“reg”(常规) 这就是我迄今为止所做的: 划定时间段 year<-(2009:2017) prd_df<-data.frame(year) prd_df["leap"]<-NA 带条件循环的基本标识 for(i in 1:length(prd_df$year)){ if((prd_df$year[i]%%4==0)&(prd_df$year[i]%%100!=0

我需要在数据框中创建一个列,其中包含一个yr字符串,该字符串将自动将每个yr标识为
“leap”
“reg”
(常规)

这就是我迄今为止所做的:

划定时间段

year<-(2009:2017)
prd_df<-data.frame(year)
prd_df["leap"]<-NA
带条件循环的基本标识

for(i in 1:length(prd_df$year)){
  if((prd_df$year[i]%%4==0)&(prd_df$year[i]%%100!=0)){
    prd_df$leap<-'leap'
  }else if((prd_df$year[i]%%4==0)&(prd_df$year[i]%%100==0)&(prd_df$year[i]%%400==0)){
    prd_df$leap<-'leap' 
  }else{
    prd_df$leap<-'reg'
  }
}
这就是我得到的:

"year"  "leap"
2009    "reg"
2010    "reg"
2011    "reg"
2012    "reg"
2013    "reg"
2014    "reg"
2015    "reg"
2016    "reg"
2017    "reg"
在上面的示例中,2012年和2016年应在第二列中标识为
“leap”
,但它不起作用。作为其他代码的一部分,条件代码以前工作得很好,但我现在无法让它工作。是否可以不将其识别为数字

任何建议都将不胜感激


谢谢

我们可以使用
ifelse

prd_df$leap <- with(prd_df, ifelse(year %%4== 0 & year %%100 !=0, "leap", "reg"))
prd_df$leap
#[1] "reg"  "reg"  "reg"  "leap" "reg"  "reg"  "reg"  "leap" "reg" 

对于您的代码,当将新值分配给列
leaf

 year<-(2009:2017)
    prd_df<-data.frame(year)
    prd_df["leap"]<-NA

    for(i in 1:length(prd_df$year)){
        if((prd_df$year[i]%%4==0)&(prd_df$year[i]%%100!=0)){
            prd_df$leap[i]<-'leap'#add [i] here
        }
        else if((prd_df$year[i]%%4==0)&(prd_df$year[i]%%100==0)&(prd_df$year[i]%%400==0)){
            prd_df$leap[i]<-'leap' #add [i] here
        }else{
            prd_df$leap[i]<-'reg'#add [i] here
        }
    }


prd_df
  year leap
1 2009  reg
2 2010  reg
3 2011  reg
4 2012 leap
5 2013  reg
6 2014  reg
7 2015  reg
8 2016 leap
9 2017  reg

尝试搜索lubridate包-我认为应该有功能来检查年份是否为闰年。 对于条件,从dplyr包中使用带有case_的mutate

整个代码不应超过5行:)

library(dplyr)
图书馆(lubridate)

非常感谢@Wen。一个愚蠢的问题:你如何打印没有引号的结果?我对R(一般编程)不熟悉,边学边学…@EBB现在你有15个声誉,你可以投票给那些回答谢谢@akrun。我可以在ifelse中使用几个条件句吗?我想它只允许一个。@EBB是的,您可以在
case\u中嵌套
ifelse
或在
case\u中使用多个条件句。与
if/else
相比,
ifelse
是矢量化的,速度更快
library(dplyr)
prd_df %>%
       mutate(leap = case_when(year %%4 == 0 & year %% 100 !=0 ~ "leap", 
                               TRUE ~"reg"))
#   year leap
#1 2009  reg
#2 2010  reg
#3 2011  reg
#4 2012 leap
#5 2013  reg
#6 2014  reg
#7 2015  reg
#8 2016 leap
#9 2017  reg
 year<-(2009:2017)
    prd_df<-data.frame(year)
    prd_df["leap"]<-NA

    for(i in 1:length(prd_df$year)){
        if((prd_df$year[i]%%4==0)&(prd_df$year[i]%%100!=0)){
            prd_df$leap[i]<-'leap'#add [i] here
        }
        else if((prd_df$year[i]%%4==0)&(prd_df$year[i]%%100==0)&(prd_df$year[i]%%400==0)){
            prd_df$leap[i]<-'leap' #add [i] here
        }else{
            prd_df$leap[i]<-'reg'#add [i] here
        }
    }


prd_df
  year leap
1 2009  reg
2 2010  reg
3 2011  reg
4 2012 leap
5 2013  reg
6 2014  reg
7 2015  reg
8 2016 leap
9 2017  reg
with(prd_df, ifelse(year %%4== 0 & year %%100 !=0, "leap", ifelse(year %%4== 0 & year %%100 !=0&year%%400==0,"leap","reg")))
[1] "reg"  "reg"  "reg"  "leap" "reg"  "reg"  "reg"  "leap" "reg" 
library(dplyr)
library(lubridate)

year_df <- data_frame(year = 1999:2017)

year_df <- year_df %>%
    mutate(leap = ifelse(leap_year(.$year), "leap", "reg"))