2010-08-10 45 views
12

Tôi có hai dữ liệu.frames. Đối với ví dụ vì chúng ta hãy nói rằng họ trông như thế này:Đặt khung dữ liệu dựa trên nội dung của một khung dữ liệu khác

df1 <- data.frame(x=rep(letters[1:26], 16)) 
df2 <- data.frame(y=letters[1:4]) 

Những gì tôi muốn làm là tập hợp con 'df1' để chứa các hàng có cột đầu tiên giá trị phù hợp với bất kỳ giá trị trong cột đầu tiên của 'df2'.

Bây giờ, tôi đã cố gắng:

subset(df1, df1$x == df2$y) 

Nhưng điều này nói với tôi rằng tôi cần data.frames kích thước bằng nhau. Suy nghĩ?

Trả lời

14

Cả hai %in%match() có thể được sử dụng cho việc này. Đây là tên cũ:

> which(df1$x %in% df2$y) 
[1] 1 2 3 4 27 28 29 30 53 54 55 56 79 80 81 82 105 
[18] 106 107 108 131 132 133 134 157 158 159 160 183 184 185 186 209 210 
[35] 211 212 235 236 237 238 261 262 263 264 287 288 289 290 313 314 315 
[52] 316 339 340 341 342 365 366 367 368 391 392 393 394 
> 
> 
> table(df1[ which(df1$x %in% df2$y), "x"]) 

a b c d e f g h i j k l m n o p q r s t u v w x y 
16 16 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
z 
0 
> 
+1

df1 [trong đó (df1 $ x% trong% df2 $ y), "x"] <- cảm ơn! –

+2

Bạn có thể thả 'which' như bạn có thể lập chỉ mục trực tiếp với một vectơ của boolean - vì vậy' df1 [df1 $ x% trong% df2 $ y, "x"] 'ngắn hơn. Tôi thích 'cái() 'như tôi đôi khi chỉ muốn các chỉ số để chắc chắn rằng tôi nhận được kết quả tạm thời chính xác. –

+1

Làm cách nào để bạn đặt tập hợp con df1 lớn hơn df2 thay vì khớp? – chimpsarehungry

Các vấn đề liên quan