2015-02-21 3 views
1

У меня есть небольшая проблема, и я не уверен, как исправить ошибку.Double For Loop и вычислять средние значения в R

В принципе, у меня есть два столбца, и я хочу использовать Double For Loop для вычисления средних значений между каждым числом в обоих столбцах, поэтому он приводит к вектору средних значений. Чтобы прояснить, применить и средние функции, это не самая лучшая функция, потому что мне нужна только половина из возможных комбинаций для получения средних значений. Например:

Col1<-c(1,2,3,4,5) 
Col2<-c(1,2,3,4,5) 
Q1<-data.frame(cbind(Col1, Col2)) 

Q1$mean<-0 
for (i in 1:length(Q1$Col1)) { 
    for (j in i+1:length(Q1$Col2)) { 
    Q1$mean[i]<-(Q1$Col1[i]+Q1$Col2[j])/2 
    } 
} 

В принципе, для каждого номера в Q1 $ Col1, я хочу это усреднить с Q1 $ Col2. Причина, по которой я хочу использовать цикл double for, заключается в устранении дубликатов. Это матрица версия для обеспечения визуализации:

1.0 1.5 2.0 2.5 3.0 
1.5 2.0 2.5 3.0 3.5 
2.0 2.5 3.0 3.5 4.0 
2.5 3.0 3.5 4.0 4.5 
3.0 3.5 4.0 4.5 5.0 

Здесь каждая строка представляет собой число от Q1 $ Col1 и каждый столбец представляет собой число от Q1 $ Col2. Однако обратите внимание, что существует избыточность по обе стороны диагональной матрицы. Поэтому, используя Double For Loop, я устраняю избыточность, чтобы получить средние значения уникальной комбинации случаев. Используя матрицу выше, она должна выглядеть следующим образом:

1.0 1.5 2.0 2.5 3.0 
    2.0 2.5 3.0 3.5 
     3.0 3.5 4.0 
      4.0 4.5 
       5.0 
+2

Ваш пример не воспроизводится, потому что у вас нет двух столбцов в 'Q1', или вы можете выполнять такие операции, как' Q1 $ Col1' на матрице. Какой здесь результат? –

+0

@DavidArenburg Я сделал корректировки. В принципе, для каждого номера в Q1 $ Col1, я хочу, чтобы он усреднял его с Q1 $ Col2. Причина, по которой я хочу использовать цикл double for, заключается в устранении дубликатов. –

+2

Я озадачен тем, каков ожидаемый результат этого алгоритма, но, вероятно, он имеет ошибку: 'i + 1: length (Q1 $ Col2)' сначала производит последовательность от 1 до 'length (Q1 $ Col2)', а затем добавляет 1 к каждому элементу вектора. Возможно, OP означало последовательность от 'i + 1' до' length (Q1 $ Col2) ', которую можно получить, например, с помощью (i + 1): length (Q1 $ Col2)'. –

ответ

1

То, что я думаю, что вы спрашиваете, это: даны два вектора чисел, как я могу найти среднее из первых элементов в каждом векторе, среднее вторых элементов в каждом векторе и т. д. Если это так, то вот как это сделать.

Во-первых, вы хотите использовать cbind() не rbind(), чтобы получить столбцы, а не строки.

Col1<-c(1,2,3,4,5) 
Col2<-c(2,3,4,5,6) 
Q1<-cbind(Col1, Col2) 

Затем вы можете использовать функцию [rowMeans()][1], чтобы выяснить (как вы уже догадались) средства каждой строки. (Смотри также rowSums() и colMeans() и colSums().)

rowMeans(Q1) 
#> [1] 1.5 2.5 3.5 4.5 5.5 

Более общий способ сделать это apply() функция, которая позволит нам применить функцию к каждому столбцу или строке. Здесь мы используем аргумент 1, чтобы применить его к строкам (потому что первая строка занимает первый элемент от Col1 и Col2 и т. Д.).

apply(Q1, 1, mean) 

Результаты таковы:

#> [1] 1.5 2.5 3.5 4.5 5.5 

Если вы действительно хотите в существующую матрицу, вы могли бы сделать что-то вроде этого:

means <- rowMeans(Q1) 
cbind(Q1, means) 
1

Вам не нужны петли на получить средние значения, вы можете использовать векторизованные операции:

Col1 <- c(1,2,3,4,5) 
Col2 <- c(2,3,4,5,6) 
Mean <- (Col1+Col2)/2 
Q1 <- rbind(Col1, Col2, Mean) 

Однако rbind рассматривает ваши векторы как строки, вы можете использовать cbind для столбцов.

1

Вы можете просто использовать функцию outer, чтобы высчитать средние значения, затем используйте lower.tri, чтобы заполнить область под диагональю матрицы с помощью значений NA.

matrix<-outer(Q1$Col1, Q1$Col2, "+")/2 
matrix[lower.tri(matrix)] = NA 
Смежные вопросы