Получение парных различий - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь получить попарные разницы в цене между местностями. Мои данные выглядят так:

table=NULL
table$id= 1:9
table$locality= c("A", "B", "C")
table$price= rnorm(9, 444, 322)
table$concat=paste(table$id, table$locality)
final=data.frame(table)
final

   id locality    price concat
   1        A 379.1501    1 A
   2        B 792.3608    2 B
   3        C 762.0627    3 C
   4        A 439.0378    4 A
   5        B 100.2860    5 B
   6        C 830.2024    6 C
   7        A 148.5925    7 A
   8        B 668.3819    8 B
   9        C 510.3919    9 C

Моя цель - получить, если возможно, получить таблицу, подобную этой переменной, в приведенной ниже таблице concat - это id:

  diff_A-B | diff_A-C | diff_B-C
    1A-2B  |  1A-3C   |  2B-3C
    1A-5B  |  1A-6C   |  2B-6C
    1A-8B  |  1A-9C   |  2B-9C
    4A-2B  |  4A-3C   |  5B-3C
    4A-5B  |  4A-6C   |  5B-6C
    4A-8B  |  4A-9C   |  5B-9C
    7A-2B  |  7A-3C   |  8B-3C
    7A-5B  |  7A-6C   |  8B-6C
    7A-8B  |  7A-9C   |  8B-9C

Я пытался:

  library(dplyr)
  table %>%
    arrange(id, locality) %>% 
    group_by(concat) %>%
    mutate(variables=outer(price,price, "-"))

Но вывод не показывает мне результаты, которые мне нужны.

Пожалуйста, любые советы будут оценены.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Наконец-то я могу получить желаемый результат, спасибо @Aakash Yadav за помощь:

table=NULL
table$id= 1:9
table$locality= c("A", "B", "C")
table$price= rnorm(9, 444, 322)
table$concat=paste(table$id, table$locality)
final=data.frame(table)
final

    id locality     price concat
    1  1        A 740.98988    1 A
    2  2        B 714.53925    2 B
    3  3        C -80.83328    3 C
    4  4        A  20.11773    4 A
    5  5        B 423.78615    5 B
    6  6        C 155.25605    6 C
    7  7        A 806.36096    7 A
    8  8        B 182.55169    8 B
    9  9        C 682.04208    9 C


final$group_number <- (final$id -1) %/%3 + 1

library(dplyr)
library(tidyr)

w=final %>%
    select(group_number, locality, price) %>%
    spread(locality, price)   

  m1= abs(outer(w$A,w$B, "-"))
  m11=t(m1)
  A_B=as.vector(m11)

  m2=abs(outer(w$A,w$C, "-"))
  m22=t(m2)
  A_C=as.vector(m22)

  m3=abs(outer(w$B,w$C, "-"))
  m3=t(m3)
  B_C=as.vector(m3)
  df=data.frame(A_B, A_C, B_C)
  df

           A_B       A_C       B_C
    1  26.45063 821.82315 795.37252
    2 317.20373 585.73383 559.28320
    3 558.43819  58.94779  32.49717
    4 694.42152 100.95100 504.61942
    5 403.66842 135.13832 268.53010
    6 162.43396 661.92435 258.25594
    7  91.82171 887.19423 263.38496
    8 382.57481 651.10491  27.29564
    9 623.80927 124.31888 499.49039
0 голосов
/ 21 января 2019

Сначала мы сгруппируем записи по 3

final$group_number <- (final$id -1) %/%3 + 1

Используя оператор распространения, вы можете конвертировать строки в столбцы, а затем просто применять математические операторы, чтобы найти разницу

final %>% select(group_number, locality, price) %>% spread(locality, price) %>% mutate(diff_A_B = A - B,diff_B_C = B - C, diff_C_A = C - A )

Надеюсь, это поможет!

...