Как выполнить сложную широкую операцию для анализа сети - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть данные опроса, которые включают, кто является респондентом (iAmX), с кем они работают (с X), как часто они работают с каждым партнером (freqX) и насколько они довольны каждым партнером (например, X).Участники могут выбрать несколько вариантов того, кем они являются и с кем работают.

Я хотел бы перейти от чего-то подобного, с одной строкой на респондента:

df <- read.table(header=T, text='
 id iAmA  iAmB  iAmC  withA withB withC freqA freqB freqC likeA likeB likeC
  1 X X NA  X X NA  3 2 NA  3 2 NA
  2 NA  NA  X X NA  NA  5 NA  NA  5 NA  NA  
                 ')

К чему-то вроде этого, с одной строкой на комбинацию, где "от" - это кто актерis and to to - это то, с кем они работают:

goal <- read.table(header=T, text='
               id from  to  freq  like
              1 A A 3 3
              1 B A 3 3
              1 A B 2 2
              1 B B 2 2
              2 C A 5 5
               ')

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

1 Ответ

0 голосов
/ 05 февраля 2019

Хотя я должен признать, что не полностью понял логику OP, приведенный ниже код воспроизводит ожидаемое goal.

Ключевыми моментами здесь являются воплощениеmelt() функция, которая способна изменить несколько столбцов измерений одновременно, и функция перекрестного соединения CJ().

library(data.table)
# reshape multiple measure columns simultaneously
cols <- c("iAm", "with", "freq", "like")
long <- melt(setDT(df), measure.vars = patterns(cols), 
             value.name = cols, variable.name = "to")[
               # rename factor levels
               , to := forcats::fct_relabel(to, function(x) LETTERS[as.integer(x)])]
# create combinations for each id
combi <- long[, CJ(from = na.omit(to[iAm == "X"]), to = na.omit(to[with == "X"])), by = id]
# join to append freq and like
result <- combi[long, on = .(id, to), nomatch = 0L][, -c("iAm", "with")]
# reorder result
setorder(result, id)
result
   id from to freq like
1:  1    A  A    3    3
2:  1    B  A    3    3
3:  1    A  B    2    2
4:  1    B  B    2    2
5:  2    C  A    5    5

Промежуточные результаты:

long
   id to  iAm with freq like
1:  1  A    X    X    3    3
2:  2  A <NA>    X    5    5
3:  1  B    X    X    2    2
4:  2  B <NA> <NA>   NA   NA
5:  1  C <NA> <NA>   NA   NA
6:  2  C    X <NA>   NA   NA

и

combi
   id from to
1:  1    A  A
2:  1    A  B
3:  1    B  A
4:  1    B  B
5:  2    C  A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...