我正在尝试检查我的数学,我按照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
非常感谢!
答案 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))
在我的代码中,如果出现问题则停止错误。)