2011-09-18 121 views
2

我有来自数据集称为babies2009 2个提取的数据集(3个向量计数,姓名,性别)比较2个数据集中的R

一个是包含所有的女孩和其他boys2009 girls2009。 我想知道男孩和女孩之间有什么相似的名字。

我想这

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

当我尝试

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

我得到的是女孩的名字不是通用名称。

我已确认这两个数据集确实分别包含的男孩和女孩做取10样本...

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

我还能如何比较2点的数据集,并确定什么样的价值观,他们两个份额。 谢谢,

+0

您将得到更好的答案,如果你把你的答案重复性:http://stackoverflow.com/questions/5963269/how-to-make-a-great- r-reproducible-example –

回答

5

common.names = (boys2009$name %in% girls2009$name)给你一个长度为length(boys2009$name)的逻辑向量。所以,当你尝试从更长的数据框中选择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

既然你想相似之处,但并未说明准确匹配,你应该考虑agrep

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

可以调节最大距离参数,以满足您的需求。

+0

+1 for'agrep'。 –

1

如何使用set functions

list(
    `only boys` = setdiff(boys2009$name, girls2009$name), 
    `common` = intersect(boys2009$name, girls2009$name), 
    `only girls` = setdiff(girls2009$name, boys2009$name) 
)