Сравнение 2 наборов данных в R - PullRequest
       20

Сравнение 2 наборов данных в R

2 голосов
/ 18 сентября 2011

У меня есть 2 извлеченных набора данных из набора данных, называемого babies2009 (3 вектора, имя, пол)

Один - girls2009, содержащий всех девочек, а другой --2009.Я хочу выяснить, какие похожие имена существуют между мальчиками и девочками.

Я попробовал это

common.names = (boys2009$name %in% girls2009$name)

Когда я пытаюсь

babies2009[common.names, ] [1:10, ]

, все, что я получаю, это девушкаимена не общие имена.

Я подтвердил, что оба набора данных действительно содержат мальчиков и девочек соответственно, выполнив 10 выборок ...

boys2009 [1:10,]
girsl2009 [1:10,]

Как еще можно сравнить 2наборы данных и определить, какие значения они оба разделяют.Спасибо,

Ответы [ 3 ]

5 голосов
/ 18 сентября 2011

common.names = (boys2009$name %in% girls2009$name) дает логический вектор длины length(boys2009$name). Поэтому, когда вы пытаетесь выбрать из гораздо более длинного data.frame babies2009[common.names, ] [1:10, ], вы получаете глупость.

Решение: используйте этот логический вектор для правильного data.frame!

boys2009 <- data.frame( names=c("Billy","Bob"),data=runif(2), gender="M" , stringsAsFactors=FALSE)
girls2009 <- data.frame( names=c("Billy","Mae","Sue"),data=runif(3), gender="F" , stringsAsFactors=FALSE)
babies2009 <- rbind(boys2009,girls2009)

common.names <- (boys2009$name %in% girls2009$name)

> boys2009[common.names, ]$names
[1] "Billy"
2 голосов
/ 20 сентября 2011

Как насчет использования установки функций :

list(
    `only boys` = setdiff(boys2009$name, girls2009$name),
    `common` = intersect(boys2009$name, girls2009$name),
    `only girls` = setdiff(girls2009$name, boys2009$name)
)
2 голосов
/ 18 сентября 2011

Поскольку вам нужны сходства, но вы не указали точное совпадение, вам следует учитывать agrep

sapply(boys2009$name , agrep,  girls2009$name, max = 0.1)

. Вы можете настроить аргумент max.distance в соответствии со своими потребностями.

...