R - 堆栈或熔化数据框

R - stack or melt dataframe

我需要对推文进行网络分析并得到以下数据框:

 # 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~

为了继续我的网络分析,我需要我的 Dataframe 如下所示:

    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)])

两种方法都给我错误的输出。 一个额外的好处是在这里包括特定的“派对”。我在这里也对其他网络分析解决方案持开放态度,但这种数据框似乎有助于从中创建图表。

在此先感谢您的帮助!

一个对我有用的解决方案是:

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

另一种选择,如果你想坚持使用 tidyverse,你可以使用 stringr 中的 str_split 将字符串列拆分为出现的字符向量(新列成为列表列) , 然后使用 unnest_longer 取消嵌套此结果。

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