Я сделаю это. Для начала мы создадим воспроизводимый набор данных из данных примера, который вы разместили:
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
Как вы можете видеть, выходные данные этого отображают формат желаемого выходного изображения и сохраняют как порядок отношений, так и повторяющихся строк.