2015-04-28 2 views
-1

В R мне нужен автоматический (матрица может иметь разное количество столбцов, поэтому заголовки не всегда являются такой же) способ извлечения строк из матрицы на основе нескольких условий, применяемых индивидуально для каждой строки. В частности, я хочу включить строку в новую матрицу, если все столбцы в этой строке, кроме последней, равны, и если последний столбец в строке равен ~ 0.R: («Автоматически») Извлечение строк на основе множества условий, применяемых к каждой строке для изменения числа столбцов

Я не могу вернуться и изменить любой код, кроме входных данных (т. е. все должно запускаться автоматически). Первый цикл for diff вычисляет различия между соответствующими столбцами в наборе данных, а следующий цикл for - извлекает строки diff, которые удовлетворяют условиям.

Rows=nrow(dataSet) 
Cols=ncol(dataSet) 
diff <- matrix(, nrow = Rows,ncol = Cols/2) 

for (i in 1:Cols/2) { 
    diff[,i]=dataSet[,i]-dataSet[,i+Cols/2]; 
} 

last_change <- matrix(, nrow = Rows, ncol = Cols/2); 
T=1; 
col1 = ((Cols/2)-1); 
col2 = Cols/2; 
col3 = 0; 
for (k in 1:Rows) { 
    if (TRUE==all.equal(diff[k,1],diff[k,2:col1]) 
     & TRUE==all.equal(diff[k,col2],col3)) 
    { 
    last_change[T,] <- subset(diff[k,]); 
    T=T+1; 
    }  
} 

Это выше дает мне матрицу с такими же размерами, как Diff (должны быть равные столбцы с достаточно несколько строк вырезал прочь), наполненную НС. (У меня проблемы с векторизации в автоматическом режиме, так как $ будет указывать разные числа и идентификаторы заголовков каждый раз, когда изменяется входной набор данных). Я довольно новичок в R. Я нашел много вопросов с похожими темами, но ни одна из них, похоже, не включает возможность применения нескольких условий к изменяющемуся количеству столбцов (и изменению идентификаторов кодовых имен).

ответ

0

Вот решение:

m <- matrix(c(1,1,1,0,2,2,13,0,3,3,3,0,4,4,4,1),4,byrow=T); 
m; 
##  [,1] [,2] [,3] [,4] 
## [1,] 1 1 1 0 
## [2,] 2 2 13 0 
## [3,] 3 3 3 0 
## [4,] 4 4 4 1 
m[apply(m[,-ncol(m)]==m[,1],1,all)&m[,ncol(m)]==0,]; 
##  [,1] [,2] [,3] [,4] 
## [1,] 1 1 1 0 
## [2,] 3 3 3 0 
+0

Огромное улучшение (СПАСИБО)! Тем не менее, теперь я получаю строки со всеми нулями (имеет смысл), которые имеют имя строки из предыдущей матрицы, и еще много строк, где каждое имя и значения строк - и NA соответственно. Хотите узнать, где/как информация может быть потеряна? –

+0

Вы можете удалить строки, имеющие хотя бы одно значение NA, с одним вызовом 'na.omit()', который может быть выполнен либо до, либо после извлечения. Имена строк можно фиксировать после факта, назначая их; см. https://stat.ethz.ch/R-manual/R-devel/library/base/html/colnames.html. Например, 'rownames (m2) <- 1: nrow (m2);'. – bgoldst

+0

Информация не была потеряна; ваша входная матрица должна иметь НС. – bgoldst

Смежные вопросы