2015-11-10 7 views
-1

У меня «cbind», изд 2 матрицы, чтобы сделать матрицу «X» таким образом, что первый столбец каждой строки вместе и то же самое для второй пары колонок:итерация через матрицы R

X1 Y1 X2 Y2 etc. 
val val val val 
val val val val 
val val val val 

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

for (i in 1:49){ 
     slope = atan((x[i+1,2]-x[i, 2])/(x[i+1,1]-x[i,1])) 
    } 

Так как вы можете видеть, что я пытаюсь получить наклон от последовательных значений спускающихся вниз первые 2 столбца. Моя проблема в том, что я не знаю, как сделать эту функцию итерацией по всей матрице и сделать то же самое с каждой парой столбцов. Любые советы?

+0

для (я в 1:49) 49 потому что есть 50 строк в каждом столбце – Chris

ответ

0

Избегайте зацикливание и использовать некоторое функциональное программирование, как diff и paste

x <- cbind(X1=1:5,Y1=c(1,2,4,8,16),X2=1:5,Y2=c(1,4,8,16,32)) 
x 

#  X1 Y1 X2 Y2 
#[1,] 1 1 1 1 
#[2,] 2 2 2 4 
#[3,] 3 4 3 8 
#[4,] 4 8 4 16 
#[5,] 5 16 5 32 

dfx <- diff(x) 
atan(dfx[,paste0("X",1:2)])/dfx[,paste0("Y",1:2)] 

#   X1  X2 
#[1,] 0.7853982 1.249046 
#[2,] 1.1071487 1.325818 
#[3,] 1.3258177 1.446441 
#[4,] 1.4464413 1.508378 
+0

wow, который выглядит довольно хорошо. но он возвращает: dfx <- diff (x) Ошибка в r [i1] - r [-length (r) :-(length (r) - lag + 1L)]: нечисловой аргумент двоичному оператору – Chris

+0

@ Крис - нет, нет. Код, который у меня есть, является воспроизводимым и полным. Попробуйте его в новой сессии R. – thelatemail

1

Первый шаг, чтобы найти разницу между каждым элементом по столбцам. Затем применим функцию наклона. (Для сравнения результатов использовалась примерная матрица @ latemail).

diffs <- apply(x, 2, function(x) x[-1]-x[-length(x)]) 
atan(diffs[,c(F,T)]/diffs[,c(T,F)]) 
#    Y1  Y2 
# [1,] 0.7853982 1.249046 
# [2,] 1.1071487 1.325818 
# [3,] 1.3258177 1.446441 
# [4,] 1.4464413 1.508378 

Как насчет Однострочник раствора, который представляет собой смесь между двумя ответами:)

atan(diff(x)[,c(F,T)]/diff(x)[,c(T,F)]) 

данных

x <- cbind(X1=1:5,Y1=c(1,2,4,8,16),X2=1:5,Y2=c(1,4,8,16,32)) 
+0

Wow thanks! Однако моя матрица называется «x», поэтому я изменил «mat» на «x», могу ли я с этим справиться? когда я запускаю команду, она говорит Ошибка: dim (x) должна иметь положительную длину – Chris

+0

@Chris У меня нет данных, это может быть что угодно. Пример, который я вам предоставил, - это показать вам, что он работает. Да, вы можете изменить имена. –

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