簡體   English   中英

R-根據條件在數據框中創建新列

[英]R - create new column in data frame based on conditional

我需要在數據框中創建一列yrs,以自動將每個yr標識為"leap""reg" (常規)。

到目前為止,這是我所擁有的:

划定時間段

year<-(2009:2017)

在該時間段內創建具有單個列的數據框

prd_df<-data.frame(year)

創建一個空列,其中將標識"leap""reg"

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'
  }
}

從結果數據框中創建一個表。

write.table(prd_df,
          file = "prd.csv",
          row.names = F, col.names = T,
          sep = "\t")

這是我得到的:

"year"  "leap"
2009    "reg"
2010    "reg"
2011    "reg"
2012    "reg"
2013    "reg"
2014    "reg"
2015    "reg"
2016    "reg"
2017    "reg"

在上面的示例中,第二列中應將2012和2016標識為"leap" ,但它不起作用。 作為其他代碼的一部分,該條件以前已經可以正常工作,但是我現在無法使其正常工作。 可能無法將prd_df$year識別為數字嗎?

任何建議將不勝感激。

謝謝

我們可以用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" 

或與case_whendplyr

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

對於您的代碼,將新值分配給列leaf時,您錯過了[i]

 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

ifelse多個條件

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" 

嘗試搜索lubridate軟件包-我認為應該有功能來檢查年份是否飛躍。 對於條件,請從dplyr軟件包中使用mutate與case_when。

整個代碼不應超過5行:)

library(dplyr)
library(lubridate)

year_df <- data_frame(year = 1999:2017)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM