如何在R中创建函数以检查数据错误?

时间:2018-10-02 22:17:41

标签: r function data-cleaning

我有很多要导入到R中进行处理的温度数据的csv文件。这些文件如下所示:

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)])

此方法有效,但不幸的是仅保留了第3列和第4列,而前两列消失了。我在这段代码上玩了太久了,并尝试了一些其他根本不起作用的方法。

我知道我可能缺少一些基本知识。任何人都有制作此函数的技巧,这些函数将用NA替换第3列和第4列中的值,而无需更改前两列?

3 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:2)

您需要在df中返回remove.errors;您还可以使用replace来更简洁地编写abs语句:

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

或者使用dplyr处理numeric /非numeric列的更清洁/更安全的替代方法

library(dplyr)
df %>% mutate_if(is.numeric, funs(replace(., abs(.) > 50, NA)))

答案 2 :(得分:2)

如果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)