Сохранение максимума вектора в другой вектор в R - PullRequest
0 голосов
/ 10 ноября 2019

Я хочу сохранить максимальное значение в векторе. R код написан ниже. Как исправить этот код, чтобы он работал без ошибок?

дата находится во фрейме данных

dat=c(3, 5, 4, 2, 8, NA, NA, 9, 10, 3)

желаемый вывод MaxRuns = c (3,5,5,5,8,8, 8,9,10,10)

maxValue=function(dat){
maxv=0
for (i in 1:10) MaxRuns(i)=0
for (i in 1:10){
if dat(i) > maxv {
maxv=dat(i) }
MaxRuns(i)=maxv
 }
return(maxv)
}
maxValue<-maxValue(dat)
maxValue

Ошибки:

dat = c (3, 5, 4, 2, 8, NA, NA, 9, 10, 3)

>     maxValue=function(dat){
+     maxv=0
+     for (i in 1:10) MaxRuns(i)=0
+     for (i in 1:10){
+     if dat(i) > maxv {
Error: unexpected symbol in:
"    for (i in 1:10){
    if dat"
>     maxv=dat(i) }
Error: unexpected '}' in "    maxv=dat(i) }"
>     MaxRuns(i)=maxv
Error: object 'maxv' not found
>      }
Error: unexpected '}' in "     }"
>     return(maxv)
Error: object 'maxv' not found
>     }
Error: unexpected '}' in "    }"
>     maxValue<-maxValue(dat)
Error in maxValue(dat) : could not find function "maxValue"
>     maxValue
Error: object 'maxValue' not found

Спасибо. MM

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

Это похоже на cummax, но вам нужно обработать NA с. Поскольку dat является полностью положительным, заменив NA s на 0 здесь.

cummax(replace(dat, is.na(dat), 0))
#[1]  3  5  5  5  8  8  8  9 10 10

Как уже упоминалось @Dason, замена значений NA на min сделает его общим

cummax(replace(dat, is.na(dat), min(dat, na.rm = TRUE)))

Вы можете получить доступ к каждому элементу вектора, используя квадратскобки ([]) и не круглые скобки (()). Я бы написал цикл примерно так.

maxv = integer(length = length(dat))
current_max = 0

for (i in seq_along(dat)) {
  if (dat[i] > current_max & !is.na(dat[i])){
     current_max <- dat[i]
  }
  maxv[i] <- current_max
}

maxv
#[1]  3  5  5  5  8  8  8  9 10 10
0 голосов
/ 10 ноября 2019

Есть несколько вещей, которые нужно исправить.

Вы можете проверить, является ли запись NA, используя is.na. Также при доступе к записям dat используйте dat [i], а не dat (i). Кроме того, старайтесь не называть переменную переменной именем, совпадающим с именем функции.

dat=c(3, 5, 4, 2, 8, NA, NA, 9, 10, 3)
maxValue=function(dat){
    maxv=0
    MaxRuns = rep(0, 10)
    for (i in 1:10){
        if (!is.na(dat[i]) && dat[i] > maxv){
            maxv=dat[i] }
    MaxRuns[i]=maxv
     }
    return(MaxRuns)
}
maxRuns<-maxValue(dat)
print(maxRuns)

печатает

[1]  3  5  5  5  8  8  8  9 10 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...