簡體   English   中英

在R中將If-Else與多個do語句鏈接

[英]Chaining If-Else with multiple do statements in R

首先,我知道SO中有很多關於R中的if / else語句的問題,但是沒有一個問題對我的具體情況有所幫助,並且我已經為此苦苦掙扎了一段時間。

我有一個看起來像這樣的數據框:

metricx <- c(5, 4.8, 4.4, 3.6, 3.2, 2.1, 1.9, .5, .3, .1)
df <- as.data.frame(metricx)

我需要基於metricx的值(風險和答案)創建兩個新變量。

我知道這可行...

df$risk <- ifelse(df$metricx >= 4.5, 'VERY HIGH', 'HIGH')
df$risk <- ifelse(df$metricx < 3.5, 'MEDIUM', df$risk)
df$risk <- ifelse(df$metricx < 2, 'LOW', df$risk)

但是顯然這不是一種優雅或有效的方法,因為我必須做幾次(我的數據集非常大,而且我的組比這更多)。 我的理解是,每次調用else時,R必須遍歷每條記錄,因此鏈式選項會更好。

我已經嘗試過了...

ifelse(df$metricx >= 4.5,
       (df$risk <- 'VERY HIGH' &
        df$answer <- 'Y')
        , 
ifelse(df$metricx >= 3.5,
       (df$risk = 'HIGH' &
        df$answer = 'Y')
        ,
ifelse(df$metricx >= 2,
        (df$risk = 'MEDIUM' &
        df$answer = 'Y')
        ,
ifelse(df$metricx >= .40,
       (df$risk = 'LOW' &
        df$answer = 'Y')
        ,
(df$risk = 'LOW' &
 df$answer = 'N')
)    
) 
)  
)      

我已經嘗試過了...

if (df$metricx >= 4.5){
  df$risk = 'VERY HIGH'
  df$answer = 'Y'
} else if (df$metricx >= 3.5){
  df$risk = 'HIGH'
  df$answer = 'Y'
} else if (df$metricx >= 2){
  df$risk = 'MEDIUM'
  df$answer = 'Y'
} else if (df$metricx >= .40){
  df$risk = 'LOW'
  df$answer = 'Y'
} else {
  df$risk = 'LOW'
  df$answer = 'N'
}

他們都給出了不同的錯誤,我都無法理解。 我看過幾個試圖解釋的站點,但仍然無法弄清楚該如何做。

我的問題:1.為什么我的解決方案不起作用? 它們似乎遵循我在R網站上看到的語法? 2.實現所需輸出的正確方法是什么?

risk <- c('VERY HIGH', 'VERY HIGH', 'HIGH', 'HIGH', 'MEDIUM', 'MEDIUM', 'LOW', 'LOW', 'LOW', 'LOW') 
answer <- c('Y','Y','Y','Y','Y','Y','Y','Y','Y', 'N')

want <- data.frame(metricx, risk, answer)

我認為使用dplyr就是您想要的,對吧?

library(dplyr)
df <- df %>% mutate(risk = cut(metricx, c(0, 2, 3.5, 4.5, 6),
                    labels = c("LOW", "MEDIUM", "HIGH", "VERY HIGH"))) %>% 
  mutate(answer = ifelse(metricx < .4, "N", "Y"))

根據定義,您將始終有一個答案,這就是為什么我不使用df $ answer的原因。 嘗試:

metricx <- c(5, 4.8, 4.4, 3.6, 3.2, 2.1, 1.9, .5, .3, .1)
df <- as.data.frame(metricx)

myif<-function(x) {
  if (x<2) y="LOW" else 
    if (x<3.5) y="MEDIUM" else
      if (x<4.5) y="HIGH" else y="VERY HIGH"
  return(y)
}
sapply(df$metricx,myif)

# or:

ifelse(df[1]<2,"LOW",
       ifelse(df[1]<3.5,"MEDIUM",
              ifelse(df[1]<4.5,"HIGH","VERY HIGH")))

# or (modified later):

myif<-function(x) {
  if (x<2) y="LOW" else 
    if (x<3.5) y="MEDIUM" else
      if (x<4.5) y="HIGH" else y="VERY HIGH"
      yv<-c(y,if (x<0.4) "N" else "Y" )
      return(yv)
}
sapply(df$metricx,myif)

暫無
暫無

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

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