我正在使用R和Sweave来检测和显示大型数据集合(数百个变量和数千个观察值)中的不一致性。这些不一致检查包括逻辑检查、总和检查等。数据集提供了插入值的可能性,但也提供了预定义代码。因此,数据集中的所有单元格都是字符类型,这在我测试求和或例如。"大于"条件。当我将字符转换为数字时,预定义代码被转换为NAs,这在我测试这些代码的条件时也会给我带来麻烦,这也是强制性的。一个小例子:
> 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,以便我也可以在它们上测试条件?
提前感谢您的帮助!
不能在一个矢量中混合使用数字和字符。例如,您可以使用有序因子:
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
会导致什么?
非常感谢,我通过创建第二个数据集解决了这个问题,我将字符转换为数字。现在我分别测试代码的逻辑一致性和和的一致性等。现在出现了另一个问题:我检测总和错误的方法仅适用于没有代码且转换后存在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吗?