R — стек или расплавленный фрейм данных

#r #dataframe #network-analysis

Вопрос:

мне нужно провести сетевой анализ твитов и получить следующий кадр данных:

  # A tibble: 10 x 3
   Screen.name    party  mentions                                                               
    <chr>          <chr>  <chr>                                                                  
 1 @_A_K_K_       CDU    ""                                                                     
 2 @A_Gloeckner   SPD    "@MartinSchulz @MartinSchulz @MartinSchulz @ManuelaSchwesig @sigmargab~
 3 @a_grotheer    SPD    "@NSC_CPMR @SouthendRNLI @weserkurier @werderbremen @ribasdiego10 @boe~
 4 @A_Schillhane~ GRUENE "@BA_Mitte_Berlin @nytimes @nutellaberliner @Flauschpolizei @A_Schillh~
 5 @Achim_P       SPD    "@spdmilk @Achim_P @jusosowl @FranzmannMarcel @KorkmazGT @c_kampmann @~
 6 @AdolfKessel1  CDU    "@CDUFraktionRLP @AdolfKessel1"                                        
 7 @AfDLindemann  AfD    "@welt @BVG_Kampagne @SeeroiberJenny @spdde @AfDBerlin @spdberlin @See~
 8 @AfdMatzke     AfD    "@APVogt @AfdMatzkeNicht @Leyla_eV @COMPACTMagazin @BjoernHoecke @Birg~
 9 @agnieszka_mdb GRUENE "@HelgeBoettcher @agnieszka_mdb @MV_AM @agnieszka_mdb @larscastellucci~
10 @alex_gauland  AfD    "@RT_Dyck @extra3 @RT_Deutsch @_Herzblatt_ @m_shalva @FraukePetry @Meu~
 

Чтобы продолжить мой сетевой анализ, мне нужно, чтобы мой фрейм данных выглядел следующим образом:

     Screen.name    mentions            party
  1 @A_Gloeckner   @MartinSchulz       SPD
  2 @A_Gloeckner   @MartinSchulz       SPD
  3 @A_Gloeckner   @MartinSchulz       SPD
  4 @A_Gloeckner   @ManuelaSchwesig    SPD
  5 @A_Gloeckner   @sigmargabriel      SPD
  6 @a_grotheer    @NSC_CPMR           SPD
  7 @a_grotheer    @SouthendRNLI       SPD
  8 @a_grotheer    @weserkurier        SPD
  9 @a_grotheer    @werderbremen       SPD
     ...           ...
 

Я попытался расплавить или сложить фрейм данных, но это не сработало:

 test <- ds %>%
  select(Screen.name, mentions)
test <- melt(test, id=c("Screen.name"))
# other approach
test <- stack(ds[,c(1,3)])
 

Оба подхода дают мне неверный результат.
Бонусом также было бы включить сюда конкретную «вечеринку». Я также открыт для другого решения для сетевого анализа здесь, но этот вид фрейма данных, по-видимому, полезен для создания графика на его основе.

Заранее спасибо за вашу помощь!

Комментарии:

1. melt и stack предназначены для объединения нескольких столбцов значений в один столбец значений (например, от широкого до длинного формата), и stack наоборот. Ваши данные содержат один string столбец, который вы хотите split объединить в строки. Это не стек и не расплав.

Ответ №1:

Другой вариант, если вы хотите придерживаться tidyverse, вы можете использовать str_split from stringr для разделения столбца строк на векторы символов вхождений (новый столбец становится столбцом списка), а затем использовать unnest_longer для отмены этого результата.

 df %>% 
  rowwise() %>% 
  mutate(mentionsplit = str_split(mentions, '\s')) %>% 
  unnest_longer(mentionsplit)
 

Комментарии:

1. Это тоже работает! Знаете ли вы решение, как также добавить столбец со значением столбца «участник»? (Я отредактировал вопрос)

Ответ №2:

Одним из решений, которое сработало для меня, было:

 s <- strsplit(ds$mentions, split = " ")
df <- data.frame(Screen.name = rep(ds$Screen.name, sapply(s, length)),mentions = unlist(s))