Я работаю с большим набором данных в R, в котором символ * используется для обозначения ячеек с пропущенными значениями. Я пытаюсь заменить ячейки с этим * на NA. Для этого я пытаюсь перебрать каждую строку (для каждого столбца), используя следующий код
for (i in 1:nrow(mydata)){
if (i == "*"){
mydata[i,] <- NA
}
}
Код выполняется, но фрейм данных остается неизменным. Может ли кто-нибудь помочь мне понять, почему это не работает, и помочь различными способами получить желаемый результат?
Это выглядит немного неэффективно; рассмотрите возможность использования dplyr::na_if ()
вместо этого. Следующий код должен работать.
library(dplyr, warn.conflicts=FALSE)
mydata <- mydata %>%
mutate(across(everything(), na_if, y = "*"))
Ты можешь просто сделать это
mydata[mydata == '*'] <- NA
Обычно цикл по кадру данных в R является плохим тоном, поскольку это неэффективно с вычислительной точки зрения. Это следует делать только в том случае, если векторизованная альтернатива недоступна. Большинство операций с фреймом данных можно выполнить без цикла.
Кроме того, ваш код не работает, потому что вы проверяете, равен ли итератор i
*
, а не проверяется, равно ли значение звезде. Ваш код проверяется
1 == *
2 == *
3 == *
etc.
Что, конечно же, каждый из них вернет FALSE
, поэтому никаких изменений не происходит. Для зацикливания вам нужно будет перебрать как строки, так и столбцы, проверяя значение mydata[i, j] == '*'
, где i
— индекс вашей строки, а j
— индекс вашего столбца.
Следуйте тому, что говорит пользователь @Mako212 здесь. Настоятельно рекомендуется и R-подобный способ выбора.
Это просто для того, чтобы продемонстрировать, как вам нужно будет изменить логику цикла for:
mydata = data.frame(
A = c("a", "b", "*"),
B = c("*", "b", "c"),
C = c("*", "b", "c"))
for(i in seq(nrow(mydata)))
for(j in seq(ncol(mydata)))
if (mydata[i, j] == "*")
mydata[i, j] = NA
mydata
#> A B C
#> 1 a <NA> <NA>
#> 2 b b b
#> 3 <NA> c c
Да, я просто хотел посмотреть, как будет выглядеть функция цикла над фреймом данных. Цените помощь
Я не использовал фигурные скобки }
. Они здесь не нужны, и зачастую не нужны.
Где это решение эффективно?