2016-06-17 5 views
2

первый пользователь здесь! Я просто изучаю R и надеюсь, что это простой вопрос. У меня есть массив чисел, nums, и я должен был бы гарантировать, что число не будет больше одного. Я пытаюсь сделатьR: Пользовательская функция в приложении()

myfct <- function(x) { 
    if (x > 1.0) x = 1.0 
    return(x) 
} 
apply(nums, 1, myfct) 

Но тогда я получаю эту ошибку

Error in apply(nums, 1, myfct) : 
dim(X) must have a positive length 

Что я делаю не так, и есть лучший способ сделать это? Благодаря!

+0

Добро пожаловать на ТАК! 'apply' может использоваться только для матриц и массивов, и похоже, что ваш' nums' является всего лишь вектором. Посмотрите на 'sapply' и' lapply'. Во-вторых, для этого и будущих вопросов у вас будет гораздо более высокая скорость ответа (больше 0), если вы сначала прочитали о [минимальном] (http://stackoverflow.com/help/mcve) и [воспроизводимых вопросах] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – r2evans

+0

Кажется, что 'nums' - это вектор. Таким образом, вы можете напрямую применять 'myfct' ie' myfct (nums) 'с изменениями в' myfct', например, чтобы изменить 'if' на' ifelse' – akrun

+5

pmin (x, 1) или x [x> 1] <- 1 – Roland

ответ

3

Мы можем использовать replace

replace(nums, nums > 1, 1) 
+1

Это работает как шарм. Я бы проголосовал за это, но, похоже, мне не хватает репутации ... –

1

Попробуйте вместо этого:

nums[] <- pmin(nums, 1) 

pmax является «распараллелить» Maximun поэтому любые значения больше чем 1 заменяется на 1. Может работали без [] если nums был атомным вектора.

+0

Это похоже на то, что я хочу, поскольку все значения ниже 1 устанавливаются в 1. Я думаю, что решение pmin - это то, что будет работать в этом конкретном случае. Этот новичок ценит помощь независимо! –

+2

Я всегда, кажется, ошибаюсь. Используйте 'pmin'. –

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