我使用R和Sweave检测并显示大型数据集中的不一致性(数百个变量和数千个观察值)。这些不一致性检查包括逻辑检查,总和检查等。数据集提供了插入值的可能性,但也提供了预定义的代码。因此,数据集中的所有单元格都具有类型字符,这在我测试总和或者例如"大于"条件。当我将字符转换为数字时,预定义的代码将转换为NA,当我在这些代码上测试条件时这也很麻烦,这也是强制性的。一个小例子:
> a <- c(1,4,3,4,"m","s")
> b <- c(1,33,1,"m",44,1)
> c <- cbind(a,b)
> a>b
[1] FALSE TRUE TRUE FALSE TRUE TRUE
你看,例如当然,4> 33不应该被检测为TRUE。有没有办法将字符转换为数字而不将我的数据集中的代码转换为NA,这样我还可以测试它们的条件?
提前感谢您的帮助!
(为了便于阅读而编辑,使用自己的单行编写每行代码)
答案 0 :(得分:0)
您不能在一个向量中混合使用数字和字符。例如,您可以使用有序因子:
a <- c(1,4,3,4,"m","s")
class(a)
#[1] "character"
b <- c(1,33,1,"m",44,1)
library(gtools)
levels <- mixedsort(union(a, b))
levels[6:7] <- levels[7:6]
#[1] "1" "3" "4" "33" "44" "s" "m"
a <- factor(a, levels=levels, ordered=TRUE)
b <- factor(b, levels=levels, ordered=TRUE)
a > b
#[1] FALSE FALSE TRUE FALSE TRUE TRUE
但这对总和没有帮助。事实上,"s" + 1
应该导致什么?
答案 1 :(得分:0)
非常感谢,我通过创建第二个数据集来解决问题,我将字符转换为数字。现在我分别测试代码的逻辑一致性和总和的一致性。现在出现了另一个问题:我检测总和中的错误的方法仅适用于没有代码和转换后NA存在的情况。如果一个单元格包含NA,则不测试它的总和。但事实上应该是这样的。一个简短的例子:
> name <- c("a","b","c","d","e","f")
> a <- c(1,4,3,4,"m","s")
> b <- c(1,33,1,"m",44,1)
> c <- c(1,1,1,1,1,"x")
> sum <- c(3,40,5,5,45,2)
> d<- as.data.frame(cbind(a,b,c,sum), stringsAsFactors=F)
> d2 <- as.data.frame(sapply(d,as.numeric))
Warnmeldungen:
1: In lapply(X, FUN, ...) : NAs durch Umwandlung erzeugt
2: In lapply(X, FUN, ...) : NAs durch Umwandlung erzeugt
3: In lapply(X, FUN, ...) : NAs durch Umwandlung erzeugt
> d1 <- cbind(name,d2)
> d1
name a b c sum
1 a 1 1 1 3
2 b 4 33 1 40
3 c 3 1 1 5
4 d 4 NA 1 5
5 e NA 44 1 45
6 f NA 1 NA 2
> test_total <- which((d1[,2]+d1[,3]+d1[,4])!=d1[,5])
> total_wrong <- d1$name[test_total]
> total_wrong
[1] b
如您所见,b被检测为错误,这是对的。但在我的数据集中,f也应被检测为错误。你知道我在哪里可以添加条件来计算NA为0吗?