2014-09-28 45 views
0

我需要對列執行函數以填充另一列,該列表示行中的數字是增長還是(保留或減少)。我正在做考慮4個值:r函數在if語句列上

df<-data.frame(a=c('cli1','cli2','cli3'),b=c(3,8,6), c=c(2,6,7), d=5:7, e=c(1,5,10), f=1:3) 

職能是:

f2<-function (tbl) {x<-data.frame(cid=tbl[,1]) 
        for (i in 5:(ncol(tbl))) {            
if 
    ((tbl[,i]+tbl[,i-1])/(tbl[,i-2]+tbl[,i-3])-1 >0) 
    {Y='sube'} 

else if 
    ((tbl[,i]+tbl[,i-1])/(tbl[,i-2]+tbl[,i-3])-1<=0) 
    {Y='baja'} 

x[,paste('_Disc',colnames(tbl)[i],sep='')]<-Y 
} 

return (x)} 

當我應用它,我得到:

Warning messages: 
1: In if ((tbl[, i] + tbl[, i - 1])/(tbl[, i - 2] + tbl[, i - 3]) > : 
    the condition has length > 1 and only the first element will be used 

我怎麼能使用if如果行iwthout使用另一個爲?謝謝。

+4

您違反了很多語法規則。從一些小東西開始,測試,然後從那裏慢慢構建。嘗試縮進你的代碼,就像人們推薦使它更易讀一樣(並且你會發現你有不平衡的'{}')。另外,'和'和'then'不是R語法的一部分。 – flodel 2014-09-28 17:04:54

+0

@ flodel謝謝我改變了它,現在編譯,但仍然出現錯誤。我認爲可能是這樣的情況,如果不能處理列數組並逐行評估它們。我怎樣才能輕鬆解決問題,而不必另外介紹? – GabyLP 2014-09-28 17:34:15

+0

@Gaby P你有多個值,其中一些是NAs。我不知道你想如何評估它。例如,在第一種情況下:'indx1 < - (df [,5] + df [,4])/(df [,3] + df [,2]);所有(na.omit(indx1)> 0)#[1] TRUE'是否像我顯示的那樣?在這種情況下,你可以使用'if(all(na.omit(indx1)> 0))' – akrun 2014-09-28 17:47:15

回答

1

嘗試:

f2New <- function(tbl) { 
    x <- data.frame(cid = tbl[, 1]) 
    for (i in 5:(ncol(tbl))) { 
    indx <- (tbl[, i] + tbl[, i - 1])/(tbl[, i - 2] + tbl[, i - 3]) 
    Y <- ifelse(indx > 0, "sube", ifelse(indx2 <= 0, "baja", NA)) 
    x[, paste("_Disc", colnames(tbl)[i], sep = "")] <- Y 
    } 
    return(x) 
    } 

    f2New(df) 
    # cid _Disce _Discf 
    #1 cli1 <NA> sube 
    #2 cli2 sube sube 
    #3 cli3 sube sube 
+0

我用indx2代替indx並工作!謝謝 – GabyLP 2014-09-28 18:12:11

+0

@Gaby P很高興知道它的工作。當你提到有關該職位的增長/維持/減少時,我感到困惑。 – akrun 2014-09-28 18:14:29