заменить значения в data.frame в R на основе двух векторов - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь написать универсальную циклическую функцию, которая заменяет одно или более нежелательные значения (например, "#N/A" & 'p') в data.frame с одним или более желаемыми значениями (например, NA) в BASE R.

Я пробовал следующее безуспешно, есть ли эффективное исправление?

input <- data.frame(id = c(1,3,"#N/A"), school = LETTERS[1:3], read_2018 =c("#N/A",'p',49))

replace = c("#N/A", 'p') # can be one or more elements
with = NA                # if shorter in length than `replace`, recycle the last element

# My solution without scucess:
lapply(seq_along(replace), function(i){input[input == replace[i]] <- with[i]; input})

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Если у вас есть ограниченные значения replace (например, 2 в данном случае), вы можете сделать

input[input == replace[1] | input == replace[2]] <- with

Однако, если значение replace может быть больше или вы не хотите их записывать один за другим, как это, вы можете использовать sapply с %in%, чтобы получить логические значения, где найдено совпадение.

input[sapply(input, `%in%`, replace)] <- with
input
#    id school read_2018
#1    1      A      <NA>
#2    3      B      <NA>
#3 <NA>      C        49
1 голос
/ 25 апреля 2020

Поскольку вы пометили свой вопрос loops, следующее должно работать с минимальной модификацией вашего попытанного решения.

for(i in seq_along(replace)){
  input[input == replace[i]] <- with[i]
  }

input
#    id school read_2018
#1    1      A      <NA>
#2    3      B      <NA>
#3 <NA>      C        49
...