2016-12-21 6 views
-1

Я пытаюсь проверить мою математику, где я добавляю две колонки, чтобы создать новый столбец, используя это в этом article:TRUE, FALSE индикатор тождественны сравнение неправильно в R

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

Я ищу любые ложные значения это указывает на то, что мое суммирование не работает правильно.

рассчитать женщин и мужчин животных с помощью этого:

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) 

Когда я смотрю на данные, я могу видеть, что я добавляю правильно, но так как у меня есть 170000 строк, Я бы хотел сделать двойной чек, если бы TotalAnimals всегда равнялась сумме женщин и мужчин.

Но ... Я всегда получаю ЛОЖЬ для всех значений в моем df $ TotalAnimalMathCorrect, даже если я вижу, что 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 ... 

Я также попытался преобразования переменных integer с as.integer вместо as.numeric, чтобы быть более конкретным, но все же каждая строка имеет FALSE для столбца TotalAnimalMathCorrect.

Любые идеи относительно того, почему идентичный вызов не дает ИСТИННОГО, когда цифры явно совпадают? Я прочитал документацию на идентичном 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

Я буду в скором времени предоставит воспроизводимый набор данных. – Jazzmine

+1

Не может следовать, так как вы не поделились каким-либо воспроизводимым примером. (Итак, вы должны поделиться небольшим * ** воспроизводимым примером ** - [см. Здесь лучшие практики (используйте код 'dput' или код совместного использования)] (http://stackoverflow.com/q/5963269/903061). – Gregor

+1

Возможно, это потому, что я не могу следовать, но почему вы используете 'sapply'? Почему бы не просто« идентичные »(df $ TotalAnimals, df $ TotalFemales + df $ TotalMales)'? Или, может быть, 'all (df $ TotalAnimals == df $ TotalFemales + df $ TotalMales) '? Вы вычисляете эти целые числа странным образом, что может привести к проблемам с точками? – Gregor

ответ

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) 

делать это таким образом (векторизация элемент-на-элемент) поможет, если вы хотите проверить , которые отличаются элементы ...

(я обычно включают в себя линию

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

в моем коде, чтобы остановить с ошибкой, если есть проблема.)

+0

Я вижу, я думал, что это была функция типа роллинга. Я вижу, что в документации говорится: «Сейф и г чтобы проверить два объекта за то, что они точно равны. Он возвращает TRUE в этом случае FALSE в каждом другом случае. «Я предполагаю, что объект - это весь dataframe, а не строка. И да, это сработало именно так, как я искал. Спасибо за вашу помощь Бен. – Jazzmine