如何从R中的dataframe1中选择行,其中dataframe $ 1column位于dataframe2 $ column中的某处

时间:2011-04-07 17:10:17

标签: r

我需要从dataframe1的行创建一个新的数据框,这样dataframe1 $ column的值就是在dataframe2 $ colum中找到的值

数据框是:

y <- "name,number,lunch  
joe,2,peaches  
steve,5,hotdog  
jon,7,clamroll  
nick,11,sloppyJoe"


x <- "number,office  
1,1b  
2,1a  
3,2s  
4,4d  
5,f4  
6,f4  
7,h3  
8,g3  
9,j7  
10,d3 
11,jk"  

df1 <- read.csv(textConnection(df1), header=TRUE, sep=",", stringsAsFactors=FALSE)  
df2 <- read.csv(textConnection(df2), header=TRUE, sep=",", stringsAsFactors=FALSE)

我试过了:

df3 <- df1[which(df1$number == df2$number), ]

无济于事。 我如何在R中正确执行此操作?我可以编写一个perl脚本,但我有大约100个这样的集合,并且不想创建更多的临时文件。

2 个答案:

答案 0 :(得分:5)

再次,%in%技巧:

> df1[df1$number %in% df2$number,]
   number office
2       2     1a
5       5     f4
7       7     h3
11     11     jk

对于它的价值,如果你想要合并它们,你可以轻松地进行合并。在这种情况下,我会说这是最干净的解决方案:为您提供每个办公室的员工,并与他们匹配:

> merge(df1,df2)
  number office  name     lunch
1      2     1a   joe   peaches
2      5     f4 steve    hotdog
3      7     h3   jon  clamroll
4     11     jk  nick sloppyJoe

检查合并的帮助文件以获取更多选项,您可以使用它做很多事情。

答案 1 :(得分:1)

Joris的回答很明显。 merge()命令对这类东西也很有用。如果您熟悉SQL连接,则可以在merge()中的大多数选项和不同的连接操作之间绘制相似之处。

#Inner join
> merge(df1,df2)
  number office  name      lunch
1      2   1a     joe  peaches  
2      5   f4   steve   hotdog  
3      7   h3     jon clamroll  
4     11     jk  nick  sloppyJoe

#Right join:
> merge(df1,df2, all.x = TRUE)
   number office  name      lunch
1       1   1b    <NA>       <NA>
2       2   1a     joe  peaches  
3       3   2s    <NA>       <NA>
4       4   4d    <NA>       <NA>
5       5   f4   steve   hotdog  
6       6   f4    <NA>       <NA>
7       7   h3     jon clamroll  
8       8   g3    <NA>       <NA>
9       9   j7    <NA>       <NA>
10     10    d3   <NA>       <NA>
11     11     jk  nick  sloppyJoe