Как сделать функцию в R для проверки ошибок данных? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть много CSV-файлов с данными о температуре, которые я импортирую в R для обработки.Эти файлы выглядят так:

ID   Date.Time          temp1    temp2
1    08/13/17 14:48:18  15.581  -0.423
2    08/13/17 16:48:18  17.510  -0.423
3    08/13/17 18:48:18  15.390  -0.423

Иногда показания температуры в столбцах 3 и 4 явно неверны и должны быть заменены значениями NA.Я знаю, что все, что больше 50 или меньше -50 - это ошибка.Я хотел бы просто удалить их прямо сейчас.Использование

df[,c(3,4)]<- replace(df[,c(3,4)], df[,c(3,4)] >50, NA)
df[,c(3,4)] <- replace(df[,c(3,4)], df[,c(3,4)] < -50, NA)

работает, но я не хочу повторять это для каждого файла, потому что он выглядит грязным.

Я хотел бы создать функцию для замены всего этого, например:

df<-remove.errors(df[,c(3,4)])

Я пытался:

remove.errors<-function (df) {
  df[,]<- replace(df[,], df[,] > 50, NA)
  df[,]<- replace(df[,], df[,] < -50, NA)
  }

df<-remove.errors(df[,c(3,4)])

Это работает, но, к сожалению, только третийи 4-е столбцы и первые два исчезают.Я слишком долго играл с этим кодом и пробовал другие вещи, которые не работали вообще.

Я знаю, что, возможно, мне не хватает чего-то простого.У кого-нибудь есть советы по созданию функции, которая заменит значения в столбцах 3 и 4 на NA, не меняя первые два столбца?

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

1) Попробуйте это.Используется только базовая R.

clean <- function(x, max = 50, min = -max) replace(x, x > max | x < min, NA)
df[3:4] <- clean(df[3:4])

1a) В качестве альтернативы мы могли бы сделать это (что не перезаписывает df):

transform(df, temp1 = clean(temp1), temp2 = clean(temp2))

2) Добавив в magrittr, мы можем сделать это:

library(magrittr)
df[3:4] %<>% { clean(.) }

3) В dplyr мы можем сделать это:

library(dplyr)

df %>% mutate_at(3:4, clean)
0 голосов
/ 03 октября 2018

Если в вашем data.frame есть нечисловые столбцы, вы можете захотеть:

remove_errors <- function(df) {
    numcols <- sapply(df, is.numeric)
    df[ , numcols] <- lapply(df[,numcols], function(x) ifelse(abs(x) > 50, NA, x))
    return(df)
}

Вот тест

set.seed(1234)
mydf <- data.frame(
    a = sample(-100:100, 20, T),
    b = sample(30:70, 20, T),
    c = sample(letters, 20, T),
    stringsAsFactors = F
)

remove_errors(mydf)
0 голосов
/ 03 октября 2018

Вам необходимо вернуть df в remove.errors;Вы также можете написать оператор replace более кратко, используя abs:

remove.errors<-function (df) {
    df[]<- replace(df, abs(df) > 50, NA)
    return(df)
}

или более чистую / безопасную альтернативу, используя dplyr, которая заботится о numeric / non- numeric столбцах

library(dplyr)
df %>% mutate_if(is.numeric, funs(replace(., abs(.) > 50, NA)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...