2013-09-11 5 views
1

Я хотел бы подмножить данные одной матрицы, используя данные во второй матрице. Столбцы одной матрицы помечены. Например,подмножество матрицы с идентификатором из другой матрицы

area1 <- c(9836374,635440,23018,833696,936079,1472449,879042,220539,870581,217418,552303,269359,833696,936079,1472449,879042,220539,870581, 833696,936079,1472449,879042,220539,870581) 
id <- c(1,2,5,30,31,34,1,2,5,1,2,5,1,2,5,30,31,34,51,52,55,81,82,85) 
mat1 <- matrix(area1, ncol=3, byrow=T) 
mat2 <- matrix(id, ncol=3, byrow=T) 
dimnames(mat1) <-list(NULL, c("a1","a2","a3")) 

mat2 содержит идентификаторы для mat1, так что размеры матрицы являются одинаковыми (т.е. mat1[1,1] идентифицирует mat2[1,1]. То, что я хочу, чтобы создать подматрицы mat1, когда строка со значениями c(1, 2, 5) показывает вверх in mat2. В этом настоящем мини-примере подматрица 1 будет иметь 2 строки данных, подматрица 2 и 3 имеют по 1 строке каждая, а подматрица 4 будет иметь 4 строки данных от mat1. Количество строк между последующими строками с 1,3 , 5 варьируется. Имеет ли это смысл?

Происхождение в свою очередь, матрицы были преобразованы из фрейма данных, с идентификатором в одном столбце и в области во втором столбце. Я не мог найти способ подмножества переменных строк между строками 1 в пределах кадра данных, поэтому я переключился на матрицу.

+2

Добро пожаловать в SO, и спасибо вам за четко заданный вопрос. Можете ли вы поделиться немного кода, который вы пробовали до сих пор, и как он не работал? Кроме того, можете ли вы точно указать, как должен выглядеть ваш ожидаемый результат? – Justin

+1

Спасибо за хороший пример! Не могли бы вы также разместить свой желаемый результат, т. Е. Четыре подматрицы. Это значительно облегчит понимание того, чего вы хотите достичь. Приветствия. – Henrik

ответ

2

Я думаю, что это охватывает его и соответствует вашему описанию:

spl <- cumsum(apply(mat2,1, function(x) all(x==c(1,2,5)))) 
split(as.data.frame(mat1),spl) 

#$`1` 
#  a1  a2  a3 
#1 9836374 635440 23018 
#2 833696 936079 1472449 
# 
#$`2` 
#  a1  a2  a3 
#3 879042 220539 870581 
# 
#$`3` 
#  a1  a2  a3 
#4 217418 552303 269359 
# 
#$`4` 
#  a1  a2  a3 
#5 833696 936079 1472449 
#6 879042 220539 870581 
#7 833696 936079 1472449 
#8 879042 220539 870581 

Результат согласуется с "подматрицами 1 будут иметь 2 строк данных, подматрицы 2 и 3 имеют 1 строку каждый, и подматрица 4 будет иметь 4 строки данных от mat1 "

+0

Я понятия не имею, как вы это перевели, но у меня есть +1! –

+0

@ SimonO101 - Я говорю свободно «начинающий R» в результате нескольких лет фальсификации в качестве графа психологии. с небольшим формальным обучением данных. – thelatemail

+1

Вы имеете в виду 'beginR' :-) –

1
mat1[which(mat2[,1]==1 & mat2[,2]==2 & mat2[,3]==5),] 
     [,1] [,2] [,3] 
[1,] 9836374 635440 23018 
[2,] 879042 220539 870581 
[3,] 217418 552303 269359 
[4,] 833696 936079 1472449 
+0

Я действительно не думаю, что это соответствует ожидаемому результату OP. – thelatemail

+0

@ thelatemail: Мне не было ясно, что ищет OP, и, следовательно, мой ответ – Metrics

1
split(as.data.frame(mat1), apply(mat2, 1, paste, collapse = " ")) 
#$`1 2 5` 
#  a1  a2  a3 
#1 9836374 635440 23018 
#3 879042 220539 870581 
#4 217418 552303 269359 
#5 833696 936079 1472449 
# 
#$`30 31 34` 
#  a1  a2  a3 
#2 833696 936079 1472449 
#6 879042 220539 870581 
# 
#$`51 52 55` 
#  a1  a2  a3 
#7 833696 936079 1472449 
# 
#$`81 82 85` 
#  a1  a2  a3 
#8 879042 220539 870581 
0

Я думаю, что от того, что вы сказали, что вы хотели, чтобы сохранить его в качестве кадра данных. Вы можете легко создавать подматрицы, захватывая строки с определенными значениями столбцов.

Здесь я помещал рамку данных вместе и делал подматрицу только для 1. Вы можете легко добавить ее, выполнив что-то вроде использования cbind на нескольких столбцах «area1».

> area1 <- c(9836374,635440,23018,833696,936079,1472449,879042,220539,870581,217418,552303,269359,833696,936079,1472449,879042,220539,870581, 833696,936079,1472449,879042,220539,870581) 
> id <- c(1,2,5,30,31,34,1,2,5,1,2,5,1,2,5,30,31,34,51,52,55,81,82,85) 
> original<-as.data.frame(cbind(id,area1)) 
> original[original$id==1,] 
    id area1 
1 1 9836374 
7 1 879042 
10 1 217418 
13 1 833696 

Тогда вы можете сделать то, что я сказал раньше, как это.

> col1<-original[original$id==1,"area1"] 
> col2<-original[original$id==2,"area1"] 
> col3<-original[original$id==5,"area1"] 
> submat<-cbind(col1,col2,col3) 
> colnames(submat)<-c("a1","a2","a3") 
> submat 
      a1  a2  a3 
[1,] 9836374 635440 23018 
[2,] 879042 220539 870581 
[3,] 217418 552303 269359 
[4,] 833696 936079 1472449 
Смежные вопросы