2017-02-19 82 views
0

我使用下面的代碼來計算稅收使用R,其中兩個變量可以作爲參數給出。當使用數據集時,我想根據類別計算稅額。我是包開發新手。請幫我解決這個問題。如何解決:條件長度> 1,只有第一個元素將被使用

我得到錯誤,當我插入數據集只有第一類是計算 並得到這個華林消息。

警告消息: 在如果(類別== 1){: 條件具有長度> 1並且僅將使用的第一元件

IIT<- function(income,category) { 
if (category == 1){ 
if (income > 0 && income <= 18200) { 
tax <- 0 
} else if (income > 18200 && income <= 37000) { 
tax <- (income - 18200) * .10 
} else if (income > 37000 && income <= 80000) { 
tax <- 3572 + (income - 37000) * .20 
} else if (income > 80000 && income <= 180000) { 
tax <- 17547 + (income - 80000) * .30 
} else if (income > 180000 && Inf) { 
tax <- 54547 + (income - 180000) * .40 
} 
return(tax)} 
else if (category==2){ 
if (income > 0 && income <= 18200) { 
    tax <- 0 
} else if (income > 18200 && income <= 37000) { 
    tax <- (income - 18200) * .15 
} else if (income > 37000 && income <= 80000) { 
    tax <- 3572 + (income - 37000) * .25 
} else if (income > 80000 && income <= 180000) { 
    tax <- 17547 + (income - 80000) * .35 
} else if (income > 180000 && Inf) { 
    tax <- 54547 + (income - 180000) * .45 
} 
return(tax) 
} 
} 
+0

你是什麼「傳遞」的功能?單值或數組/數據框? – lbusett

+0

'if(income && category == 1)'應該做什麼,你真的是指'if(category == 1)'? – Bernhard

+0

可以說datset有收入和類別, 收入:25000,25000,30000,30000 類別:1,2,1,2 如程序1中所述,具有不同的稅收設置,2有不同的規則集爲稅。 – Sulthan

回答

1

首先,嘗試保持簡單。你的語法比需要的更復雜。對於單個值對,可以將您的功能更改爲:

single.IIT <- function(income, category) { 
    if (income < 0) stop("Error in IIT: income must bei > 0.") 
    if (category == 1){ 
     if (income <= 18200) return(0) 
     if (income <= 37000) return((income - 18200) * .19) 
     if (income <= 80000) return(3572 + (income - 37000) * .325) 
     if (income <= 180000) return(17547 + (income - 80000) * .37) 
     return(54547 + (income - 180000) * .45) 
     } 

    if (category==2){ 
     if (income <= 18200) return(0) 
     if (income <= 37000) return((income - 18200) * .15) 
     if (income <= 80000) return(3572 + (income - 37000) * .25) 
     if (income <= 180000) return(17547 + (income - 80000) * .35) 
     return(54547 + (income - 180000) * .45) 
    } 

    stop("ERROR in IIT: category must be either 1 or 2.") 
} 

您可以在短版本中更容易地發現錯誤。當你想同時做一對以上數據,你需要向量化的:

IIT <- Vectorize(single.IIT) 

現在你可以測試一下:

> IIT(income = c(23000, 500000, 0), category = c(1, 2, 1)) 
[1] 912 198547  0 
> IIT(income = c(0, 0, 500, 500, 19000, 19000, 40000, 40000), 
+  category = c(1, 2, 1, 2, 1, 2, 1, 2)) 
[1] 0 0 0 0 152 120 4547 4322 
> IIT(income = c(0, 18000, -20), category = c(1, 1, 1)) 
Error in (function (income, category) : 
Error in IIT: income must bei > 0. 
> IIT(income = c(0, 18000, 202), category = c(1, 1, 5)) 
Error in (function (income, category) : 
ERROR in IIT: category must be either 1 or 2. 

編輯:在你問如何評論用這個數據幀:

expl <- data.frame(income = c(30000, 40000, 50000,60000), 
        bodyweight = c(75, 60, 45, 98), 
        nationality = c("F", "CH", "D", "AU"), 
        category = c(1, 2, 1, 2)) 
# we need the first and the fourth column in that dataframe 
expl$tax <- IIT(expl[[1]], expl[[4]]) 
print(expl) 
plot(tax ~ income, data = expl, col=category, pch=19) 
+0

非常感謝你,它工作得很好,但是當我導入一個數據幀FRM電子表格。這沒有用。你能說出如何使用它嗎? – Sulthan

+0

請不要寫「不起作用」,而是指定什麼不起作用。如果你想了解一個函數如何處理你的數據,請提供一些數據。這一次,我編輯了我的答案,以提供一個示例數據框以及如何使用它。 – Bernhard

+0

我很抱歉使用它。 如果我將電子表格插入到R環境中,我現在有一個電子表格,其中包含兩列第一列「收入」和其他「類別」 。我只收到類別1的答案。它不計算Cat 2的值,當cat在數據中被提及爲2時。它仍然計算並單獨發送結果1。 – Sulthan

相關問題