Изменить форму данных столбца 3 с идентификатором - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь создать ориентированный сетевой граф в R. Для этого мне нужно создать матрицу того, какие узлы связаны.

SOURCE_SUBREDDIT    TARGET_SUBREDDIT          LINK_SENTIMENT
rddtgaming            rddtrust                  1
xboxone             battlefield_4               1
ps4                   battlefield_4             1
fitnesscirclejerk   leangains                   1
fitnesscirclejerk   lifeprotips                 1
cancer              fuckcancer                  1
jleague                 soccer                  1
bestoftldr              tifu                    1
quityourbullshit          pics                  1
bestof                    confession            1
anarchychess                funny               1
internet_box                ama                 1
fitnesscirclejerk             nofap             1
ffxiv                   ffxivapp                1
switcharoo              funny                   1
bitcoinmining         bitcoin                   1
subredditdrama        nfl                      -1
rddtgaming            rddtrust                 -1

Как вы можете видеть выше, первая и последняя пара имеют одинаковые субредиты. Данные показывают взаимосвязь между субредитами, поэтому существует несколько пар

Пожалуйста, смотрите фото для того, что я хочу, чтобы вывод был похож:

enter image description here

Пока мой код:

#reading in csv file
mydata <- read.csv(file="C:/Users/bmpmap/Documents/School/Netowrk Analysis/Connections List.csv", header=TRUE, sep=",")

colnames(mydata)
#SOURCE_SUBREDDIT TARGET_SUBREDDIT LINK_SENTIMENT


#install.packages("splitstackshape")
library(splitstackshape)
mydata_id = getanID(mydata , c("SOURCE_SUBREDDIT", "TARGET_SUBREDDIT", "LINK_SENTIMENT"))

colnames(mydata_id)

#reshaping data

Я создаю переменную ID в коде выше. Я думаю, что я должен использовать это, чтобы однозначно идентифицировать пары

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Я сделаю это. Для начала мы создадим воспроизводимый набор данных из данных примера, который вы разместили:

df <- structure(list(SOURCE_SUBREDDIT = c("rddtgaming", "xboxone", 
"ps4", "fitnesscirclejerk", "fitnesscirclejerk", "fitnesscirclejerk", 
"cancer", "jleague", "bestoftldr", "quityourbullshit"), TARGET_SUBREDDIT = c("rddtrust", 
"battlefield_4", "battlefield_4", "leangains", "lifeprotips", 
"leangains", "fuckcancer", "soccer", "tifu", "pics"), LINK_SENTIMENT = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 10L), class = "data.frame")

Обратите внимание, что fitnesscirclejerk дважды связан с leangains, и эта функция, о которой вы упоминали, встречается в ваших данных:

df

    SOURCE_SUBREDDIT TARGET_SUBREDDIT LINK_SENTIMENT
1         rddtgaming         rddtrust              1
2            xboxone    battlefield_4              1
3                ps4    battlefield_4              1
4  fitnesscirclejerk        leangains              1
5  fitnesscirclejerk      lifeprotips              1
6  fitnesscirclejerk        leangains              1
7             cancer       fuckcancer              1
8            jleague           soccer              1
9         bestoftldr             tifu              1
10  quityourbullshit             pics              1

Теперь цель состоит в том, чтобы распространить это от длинного формата к широкоформатному, как в примере изображения, которое вы разместили. Как вы уже определили, идентичные строки (строки 4 и 6) создают проблему при попытке распространения:

tidyr::spread(df, key = TARGET_SUBREDDIT, value = LINK_SENTIMENT, fill = 0)

Error: Each row of output must be identified by a unique combination of keys.
Keys are shared for 2 rows:
* 4, 6
Do you need to create unique ID with tibble::rowid_to_column()?

Поскольку вы хотите сохранить одинаковое количество строк при разбрасывании, мы можем обойти это, добавив уникальный идентификатор в каждую строку, чтобы каждая строка была уникальной. Вы делаете это с splitstackshape::getanID, но мы можем сделать это и с tidyverse пакетами:

df2 <- dplyr::mutate(df, rowid = dplyr::row_number())
df2 <- tibble::rowid_to_column(df)

Оба они дают нам этот data.frame, который, как я предполагаю, похож на ваш mydata_id:

df2

   rowid  SOURCE_SUBREDDIT TARGET_SUBREDDIT LINK_SENTIMENT
1      1        rddtgaming         rddtrust              1
2      2           xboxone    battlefield_4              1
3      3               ps4    battlefield_4              1
4      4 fitnesscirclejerk        leangains              1
5      5 fitnesscirclejerk      lifeprotips              1
6      6 fitnesscirclejerk        leangains              1
7      7            cancer       fuckcancer              1
8      8           jleague           soccer              1
9      9        bestoftldr             tifu              1
10    10  quityourbullshit             pics              1

Теперь, когда мы распространяем, существование столбца уникального идентификатора не позволяет R объединять (или пытаться объединить) строки с одинаковыми парами subreddit:

df3 <- tidyr::spread(df2, key = TARGET_SUBREDDIT, value = LINK_SENTIMENT, fill = 0)
df3

   rowid  SOURCE_SUBREDDIT battlefield_4 fuckcancer leangains lifeprotips pics rddtrust soccer tifu
1      1        rddtgaming             0          0         0           0    0        1      0    0
2      2           xboxone             1          0         0           0    0        0      0    0
3      3               ps4             1          0         0           0    0        0      0    0
4      4 fitnesscirclejerk             0          0         1           0    0        0      0    0
5      5 fitnesscirclejerk             0          0         0           1    0        0      0    0
6      6 fitnesscirclejerk             0          0         1           0    0        0      0    0
7      7            cancer             0          1         0           0    0        0      0    0
8      8           jleague             0          0         0           0    0        0      1    0
9      9        bestoftldr             0          0         0           0    0        0      0    1
10    10  quityourbullshit             0          0         0           0    1        0      0    0

Как вы можете видеть, выходные данные этого отображают формат желаемого выходного изображения и сохраняют как порядок отношений, так и повторяющихся строк.

0 голосов
/ 22 апреля 2019

Вы можете сделать что-то вроде этого -

> table(dt$SOURCE_SUBREDDIT,dt$TARGET_SUBREDDIT)

ВЫХОД -

                  ama battlefield_4 bitcoin confession ffxivapp fuckcancer funny leangains lifeprotips nfl nofap pics rddtrust soccer tifu
  anarchychess        0             0       0          0        0          0     1         0           0   0     0    0        0      0    0
  bestof              0             0       0          1        0          0     0         0           0   0     0    0        0      0    0
  bestoftldr          0             0       0          0        0          0     0         0           0   0     0    0        0      0    1
  bitcoinmining       0             0       1          0        0          0     0         0           0   0     0    0        0      0    0
  cancer              0             0       0          0        0          1     0         0           0   0     0    0        0      0    0
  ffxiv               0             0       0          0        1          0     0         0           0   0     0    0        0      0    0
  fitnesscirclejerk   0             0       0          0        0          0     0         1           1   0     1    0        0      0    0
  internet_box        1             0       0          0        0          0     0         0           0   0     0    0        0      0    0
  jleague             0             0       0          0        0          0     0         0           0   0     0    0        0      1    0
  ps4                 0             1       0          0        0          0     0         0           0   0     0    0        0      0    0
  quityourbullshit    0             0       0          0        0          0     0         0           0   0     0    1        0      0    0
  rddtgaming          0             0       0          0        0          0     0         0           0   0     0    0        2      0    0
  subredditdrama      0             0       0          0        0          0     0         0           0   1     0    0        0      0    0
  switcharoo          0             0       0          0        0          0     1         0           0   0     0    0        0      0    0
  xboxone             0             1       0          0        0          0     0         0           0   0     0    0        0      0    0

ПРИМЕЧАНИЕ - Ваш ожидаемый результат непоказать id столбец.

...