2016-01-21 96 views
-6

關於此論壇上的if語句有幾個問題。我嘗試了這些建議,但代碼每次都會產生相同的錯誤。這裏的代碼應該做的事情的描述:R中的If語句的說明

  • 建立在現有的數據框(文件)的新列(效率)
  • 填充基於從現有的列(持續時間)值
效率列

我創建了下面的代碼:

file$Efficiency<-if(file$Duration <= 5) {"Above Par"} else 
{if(file$Duration > 5 & file$Duration <= 15) {"Par"} else 
{if(file$Duration > 15 & file$Duration <= 30) {"Below Par"} else 
{"Unacceptable"}}} 

我得到以下警告

Warning message: 
In if (file$Duration <= 5) { : 
the condition has length > 1 and only the first element will be used 

在幾篇文章中提到,如果陳述採取一個值,並沒有接受,作爲我看到的解釋。如果聲明是真的,那麼我想知道else函數有什麼用處。

+2

您是否在尋找削減'()'? – jogo

+4

這些帖子沒有提到處理向量時需要使用'ifelse' ????????? –

+0

@jogo:我以前沒有聽說過裁員。你會擴展它嗎? – sfyn

回答

1
file$Efficiency <- cut(file$Duration, breaks=c(-1,5,15,30,200), labels=c("Above Par", "Par", "Below Par", "Unacceptable")) 

下面是數據從我一個小例子:

x <- c(0,1, 4:6, 14:16, 29:31) 
y <- cut(x, breaks=c(-1,5,15,30,200), labels=c("Above Par", "Par", "Below Par", "Unacceptable")) 
data.frame(x=x, y=y) 
+0

感謝您分享此內容。我以前沒見過這個,我很感謝你分享這個。 – sfyn

+0

這是好的,我總是似乎忘了切() – latorrefabian

0

假設你有一個叫列長

a = data.frame(Duration=c(1,2,3,4,3,4,5,6,7)) 

一個數據幀定義返回根據效率值的函數持續時間:

eff <- function(duration){ 
    if (duration<5) return('bad') 
    else return('good')} 

用於數據幀

a[, 'Efficiency'] <- sapply(a$Duration, eff) 

完成

+2

不,沒有數據框的例子 – latorrefabian

+0

感謝您發佈這個例子,但它確實分離了兩個級別,而不是4,因爲我需要它。 – sfyn

+0

當然這是一個例子,這個想法就是你學習。通過這個例子,您可以定義更復雜的方式來分配級別,而限制您的時間間隔。 – latorrefabian

2

這裏創建一個新列的有兩個ifelse語句向量化的解決方案:

file <- data.frame(Duration=c(1,2,3,4,3,4,5,6,7)) 
d <- ifelse (file$Duration > 3, "medium", "short") 
d <- ifelse (file$Duration > 6, "long", d) 
> d 
#[1] "short" "short" "short" "medium" "short" "medium" "medium" "medium" "long" 
+0

感謝您發表本文。這樣做更好理解,並有助於接受其他一些以前的評論(如完全一樣)以考慮是否存在問題! – sfyn

+0

@sfyn很高興我能幫忙。你可能想看看邏輯子集的主題。它通常更簡潔,在我看來,比「ifelse」陳述更清晰。例如,上面代碼中的第三行可以簡單地爲'd [file $ Duration> 6] < - 「long」'。 – RHertel