вычислить положение символа над data.frame - PullRequest
0 голосов
/ 07 декабря 2018

Как вы меняете значения в строке в зависимости от положения конкретного символа?

Я хочу заменить по строке все значения NA на 0, которые ДО в строке.После этого конкретного символа S необходимо сохранить NA в строке.

S - маркер конца данных строкой.

Перед S: NA должны быть значения (фактически нулевые значения !!).

После того, как S: NA остается NA, никаких значений вообще нет.

Пример кадра данных доступен здесь dataframe.txt

У меня естьпробовал этот цикл

for (i in 1:length(df)) {
    x <- pos = 's' ; y <- pos = i if (y < x) { if (y == "NA"){ replace(y,0) } } 
}

Может быть, с функцией which ...

Спасибо за ваши идеи по этому поводу !!Alex

1 Ответ

0 голосов
/ 07 декабря 2018

Этот код заменит все NA до "S" на 0 в вашем векторе:

initial_row <- c(1,2,4,NA,4,NA,2,"S",NA,NA,NA)

result_row <- initial_row
result_row[is.na(result_row[1:which(result_row == "S")[1]])] <- 0

Объяснение: Сначала мы скопировали начальную строку в строку результатов, над которой мы будем работать.Затем мы выбрали NA в строке результатов, которые находятся между позицией 1 и позицией «S».Эти значения заменяются на ноль.

Важные допущения:

  1. Вектор имеет длину не менее 2.
  2. Вектор содержит "S"

Loop версия

Если вы настаиваете на использовании цикла, чтобы сделать это (будет работать медленнее), вы можете сделать это:

for(i in 1:length(result_row)){
  if(result_row[i] == "S"){
    break
  }
  if(is.na(result_row[i])){
    result_row[i] <- 0
  }
}

Редактировать: если у вас есть символы "NA" в вашем векторе вместоNA (который R распознает как отсутствующий элемент), этот код необходимо изменить следующим образом:

result_row[(result_row[1:which(result_row == "S")[1]]) == "NA"] <- 0

или

for(i in 1:length(result_row)){
  if(result_row[i] == "S"){
    break
  }
  if(result_row[i] == "NA"){
    result_row[i] <- 0
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...