我需要从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个这样的集合,并且不想创建更多的临时文件。
答案 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