如何在不生成NA的情况下将字符转换为数字

时间:2014-08-25 11:33:45

标签: r character sweave

我使用RSweave检测并显示大型数据集中的不一致性(数百个变量和数千个观察值)。这些不一致性检查包括逻辑检查,总和检查等。数据集提供了插入值的可能性,但也提供了预定义的代码。因此,数据集中的所有单元格都具有类型字符,这在我测试总和或者例如"大于"条件。当我将字符转换为数字时,预定义的代码将转换为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,这样我还可以测试它们的条件?

提前感谢您的帮助!

(为了便于阅读而编辑,使用自己的单行编写每行代码)

2 个答案:

答案 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吗?