RUE中的TRUE FALSE相同的比较指示符错误

时间:2016-12-21 21:15:05

标签: r sum comparison

我正在尝试检查我的数学,我按照article使用此列添加两列来创建新列:

df$TotalAnimalMathCorrect <- sapply(df$TotalAnimals, identical, df$TotalFemales+df$TotalMales)) 

我正在寻找任何可能表示我的总和无效的FALSE值。

我用这个来计算雌性和雄性动物:

df$TotalMales <- apply(subset(df, select = c(Gender.1,Gender.2,Gender.3,Gender.4)), 1, function(x) length(which(x=="Male")))

#convert to a numeric variable
quote_data_in$TotalMales<- as.numeric(quote_data_in$TotalMales)

df$TotalFemales <- apply(subset(df, select = c(Gender.1,Gender.2,Gender.3,Gender.4)), 1, function(x) length(which(x=="Female")))

#convert to a numeric variable
quote_data_in$TotalFemales<- as.numeric(quote_data_in$TotalFemales)

当我查看数据时,我可以看到我正确添加但由于我有170,000行,我想通过查看TotalAnimals是否总是等于Female和Male动物的总和来进行双重检查。

但是......对于我的df $ TotalAnimalMathCorrect中的所有值,我总是得到FALSE,即使我看到1 + 1 = 2,df $ TotalAnimalMathCorrect中的值。

我还检查并确认所有三列均为数字,并在添加数字之前应用了as.numeric,如上所示,此处

> str(df$TotalMales)
 num [1:16929] 1 0 0 1 0 0 0 0 0 0 ...
> str(df$TotalFemales)
 num [1:16929] 0 1 1 0 1 0 2 1 1 0 ...
> str(df$TotalAnimals)
 num [1:16929] 1 1 1 1 1 1 2 1 1 1 ...

我还尝试使用as.integer而不是as.numeric将变量转换为整数,更具体但仍然每行对于TotalAnimalMathCorrect列都有一个FALSE。

当数字明显匹配时,有关同一个呼叫为什么没有给出TRUE的任何想法?我阅读了相同here

的文档

以下是我期望的一些示例数据:

> TotalFemales    TotalFemales    TotalAnimals    TotalAnimalMathCorrect
> 1               1               2               TRUE

但是,就像我说的那样,我得到了这个:

TotalFemales    TotalFemales    TotalAnimals    TotalAnimalMathCorrect
1               1               2               FALSE

这是可重现的代码。

df<- data.frame(TotalMales=c(1,1,0),TotalFemales=c(1,0,0),TotalAnimals=c(2,1,0)) 

  TotalMales TotalFemales TotalAnimals
1          1            1            2
2          1            0            1
3          0            0            0

非常感谢!

1 个答案:

答案 0 :(得分:2)

你的问题是那个

sapply(df$TotalAnimals, identical, df$TotalFemales+df$TotalMales)

TotalAnimals元素匹配TotalFemales+TotalMales;相反,它需要 TotalAnimals的每个元素并将其与整个TotalFemales+TotalMales向量进行比较...即,它相当于

 identical(df$TotalAnimals[1],df$TotalFemales+df$TotalMales)
 identical(df$TotalAnimals[2],df$TotalFemales+df$TotalMales)
 ...

这些比较中的每一个都给出了FALSE,因为它将长度为1的数字向量与长度为N的数值向量进行比较(其中N是df的行数)。

with(df,identical(TotalAnimals, TotalFemales+TotalMales))

应该可以正常工作。如果您不需要担心NA值,另一种选择是

with(df,TotalAnimals==TotalFemales+TotalMales)
如果你想检查哪些元素不同,

这样做(vectorized element-by-element)会有所帮助...

(我通常会包含

stopifnot(identical(df$TotalAnimals,df$TotalFemales+df$TotalMales))

在我的代码中,如果出现问题则停止错误。)