2011-12-12 67 views
3

我有一個矩陣X1與6列。 X1矩陣中的第3列包含RouteNo。我也有一個矢量V1這是從另一個矩陣中提取的。該向量中的幾個值與X1中的RouteNo匹配。任務是從矩陣X1獲取子集,其中RouteNoX1匹配RouteNoV1匹配。 V1包含比矩陣X1多出的RouteNo使用來自另一個矩陣的列的子集R

> X1 
    V1 V2  V3 V4 V5 V6 
1 1 2 84072082 1 2000 0 
2 2 2 84046006 1 2000 0 
3 3 2 84046006 1 2001 0 
4 4 2 84046006 1 2002 0 
5 5 2 84021002 1 2002 0 
6 6 2 84021002 1 2003 0 
7 7 2 84021002 1 2003 0 
8 8 2 84021002 1 2004 0 
9 9 2 84021002 1 2005 0 
10 10 2 84021002 1 2005 0 
11 11 2 12468015 1 2006 0 
12 12 2 12468015 1 2007 0 
13 96 2 12468015 2 2000 0 
> V1 
[1] 84021001 84021002 84021105 84046006 84046007 84046008 84046009 84046011 84046013 84046014 
> n2 = subset(X1, subset = X1[,3] %in% V1) 
> dim(n2) 
[1] 0 6 

我試過使用subset函數,但我沒有得到想要的結果。我期望得到矩陣如下

2 2 2 84046006 1 2000 0 
3 3 2 84046006 1 2001 0 
4 4 2 84046006 1 2002 0 
5 5 2 84021002 1 2002 0 
6 6 2 84021002 1 2003 0 
7 7 2 84021002 1 2003 0 
8 8 2 84021002 1 2004 0 
9 9 2 84021002 1 2005 0 

有沒有其他的方式來得到結果?任何幫助表示讚賞。預先感謝。

+0

Joshua Ulrich,您如何格式化R StackOverflow網站上的代碼? –

+0

縮進四個空格或使用大括號按鈕,您可以在您的帖子上按編輯並親自查看 – abcde123483

+0

NB_R您不希望將同一個名稱用作矩陣中列名稱的矢量。給你的名字有用的名字。 –

回答

3

您遇到了範圍界定問題。您的data.frame中有一個名爲V1的列x1。矢量改變你仰望的名稱不是列名,一切都應該罰款,即:

subset(x1, V3 %in% v1) 

或使用[索引直接

x1[x1$V3 %in% V1,] 

證據是在布丁:

txt1 <- " V1 V2  V3 V4 V5 V6 
1 1 2 84072082 1 2000 0 
2 2 2 84046006 1 2000 0 
3 3 2 84046006 1 2001 0 
4 4 2 84046006 1 2002 0 
5 5 2 84021002 1 2002 0 
6 6 2 84021002 1 2003 0 
7 7 2 84021002 1 2003 0 
8 8 2 84021002 1 2004 0 
9 9 2 84021002 1 2005 0 
10 10 2 84021002 1 2005 0 
11 11 2 12468015 1 2006 0 
12 12 2 12468015 1 2007 0 
13 96 2 12468015 2 2000 0" 
txt2 <- "84021001 84021002 84021105 84046006 84046007 84046008 84046009 84046011 84046013 84046014" 

x1 <- read.table(textConnection(txt1)) 
#Note the lowercase 
v1 <- read.table(textConnection(txt2)) 
#Make "V1" as you have it 
V1 <- v1 

> #Bad 
> dim(subset(x1, V3 %in% V1)) 
[1] 0 6 
> #Good 
> dim(subset(x1, V3 %in% v1)) 
[1] 9 6 
#Does subset method equal the direct indexing method 
> all.equal(subset(x1, V3 %in% v1),x1[x1$V3 %in% V1,]) 
[1] TRUE 
+0

好的,趕上!這是一個非常狡猾的錯誤。 – abcde123483

+0

@ulvund - 在那裏,做到了這一點,有幾個小時的頭抓撓證明它:) – Chase