Подмножество матрицы, используя столбец из другой матрицы в R - PullRequest
4 голосов
/ 13 декабря 2011

У меня есть матрица X1 с 6 столбцами.Столбец 3 в этой матрице X1 содержит RouteNo.У меня также есть вектор V1, который извлекается из другой матрицы.Несколько значений из этого вектора совпадают с RouteNo в X1.Задача состоит в том, чтобы взять подмножество из матрицы X1, где RouteNo из X1 совпадает с RouteNo из V1.V1 содержит больше RouteNo, чем в матрице X1.

> 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

Есть ли другой способ получить результат?Любая помощь приветствуется.Спасибо заранее.

1 Ответ

4 голосов
/ 13 декабря 2011

У вас проблемы с определением объема. В вашем data.frame x1 есть столбец с именем V1. Измените ваш вектор поиска на имя, которое не является именем столбца, и все должно быть хорошо, т.е.

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
...