Мне нужно выполнить функцию над столбцами, чтобы заполнить другой столбец, который представляет, если числа в строке растут или (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, используя другой для? Благодарю.
Вы нарушаете много правил синтаксиса. Начните с чего-то маленького, теста и медленно постройте оттуда. Попробуйте отложить свой код, как люди рекомендуют сделать его более читаемым (и вы обнаружите, что у вас есть неуравновешенный '{}'). Кроме того, 'и' и' then' не являются частью синтаксиса R. – flodel
@flodel thanks Я изменил его и теперь компилируется, но все равно получаю сообщение об ошибке. Я думаю, может быть, что if не может обрабатывать массивы столбцов, оценивая их по строкам. Как я могу решить это легко и не нужно вводить другой? – GabyLP
@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