2014-09-28 3 views
0

Мне нужно выполнить функцию над столбцами, чтобы заполнить другой столбец, который представляет, если числа в строке растут или (mantain или уменьшение). Я делаю это с учетом 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

+0

@flodel thanks Я изменил его и теперь компилируется, но все равно получаю сообщение об ошибке. Я думаю, может быть, что if не может обрабатывать массивы столбцов, оценивая их по строкам. Как я могу решить это легко и не нужно вводить другой? – GabyLP

+0

@Gaby P у вас есть несколько значений, а некоторые из них - НС. Я не знаю, как вы хотите его оценить. Например, в первом случае: 'indx1 <- (df [, 5] + df [, 4])/(df [, 3] + df [, 2]); all (na.omit (indx1)> 0) # [1] TRUE 'Это что-то вроде того, что я показал? В этом случае вы можете использовать 'if (all (na.omit (indx1)> 0))' – akrun

ответ

1

Try:

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

+0

@Gaby P Рад узнать, что это сработало. Я был растерян, так как вы упоминали о росте/поддержании/сокращении должности. – akrun

Смежные вопросы