我有很多要导入到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列中的值,而无需更改前两列?
答案 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)