Работать с парами строк фрейма данных - PullRequest
6 голосов
/ 11 апреля 2010

У меня есть фрейм данных в R, и я хотел бы выполнить вычисление для всех пар строк. Есть ли более простой способ сделать это, чем использовать вложенный цикл for?

Чтобы сделать это конкретным, рассмотрим фрейм данных с десятью строками, и я хочу вычислить разницу баллов между всеми (45) возможными парами.

> data.frame(ID=1:10,Score=4*10:1)
   ID Score
1   1    40
2   2    36
3   3    32
4   4    28
5   5    24
6   6    20
7   7    16
8   8    12
9   9     8
10 10     4

Я знаю, что мог бы сделать это вычисление с помощью вложенного цикла for, но есть ли лучший (больше R-ish) способ сделать это?

Ответы [ 4 ]

7 голосов
/ 11 апреля 2010

Чтобы рассчитать разницу, возможно, вы могли бы использовать

outer(df$Score,df$Score,"-")
5 голосов
/ 11 апреля 2010

Здесь другое решение, использующее combn:

df <- data.frame(ID=1:10,Score=4*10:1)
cm <- combn(df$ID,2)
delta <- df$Score[cm[1,]]-df$Score[cm[2,]]

или более напрямую

df <- data.frame(ID=1:10,Score=4*10:1)
delta <- combn(df$ID,2,function(x) df$Score[x[1]]-df$Score[x[2]])
3 голосов
/ 11 апреля 2010

dist () - ваш друг.

dist(df$Score)

Вы можете поместить это как матрицу:

as.matrix( dist(df$Score) )
3 голосов
/ 11 апреля 2010
colmx = matrix(rep(df[,2], 10), ncol=10, byrow=F)
rowmx = matrix(rep(df[,2], 10), ncol=10, byrow=T)
delta = colmx - rowmx
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...