У меня есть кадр данных в R, и я хотел бы выполнить вычисление на всех парах строк. Существует ли более простой способ сделать это, чем использование вложенного для цикла?
Для создания этого бетона рассмотрите кадр данных с десятью строками, и я хочу вычислить различие очков между всем (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
Я знаю, что мог сделать это вычисление с вложенным для цикла, но являюсь там лучшим (больше R-выхода) способ сделать это?
Здесь другое решение, использующее 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]])
colmx = matrix(rep(df[,2], 10), ncol=10, byrow=F)
rowmx = matrix(rep(df[,2], 10), ncol=10, byrow=T)
delta = colmx - rowmx
dist () - ваш друг.
dist(df$Score)
Вы можете представить это в виде матрицы:
as.matrix( dist(df$Score) )
Для вычисления разницы, возможно, вы можете использовать
outer(df$Score,df$Score,"-")