r语言 - 如何将字符转换为数字而不生成NAs



我正在使用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吗?

最新更新