R paste values of list for every entry in the Data Frame

Viewed 555

i want to paste values from a list in a dataframe for every row in the dataframe. "Screen.name" is a list of twitter accounts, "Text" is every tweet from this person, and "mentions" is extracting all mentions the user has mad. The dataframe looks like this:

  Screen.name    Text                                                        mentions   
  <chr>          <chr>                                                       <list>     
  1 _A_K_K_        "Danke für 30 Jahre Initiative Völklinger Hütte. Wie aus d~ <chr [0]>  
  2 A_Gloeckner    "#Aufbruch. Tolle Rede vom Kanzlerkandidaten @MartinSchulz~ <chr [7]>  
  3 a_grotheer     "- Breaking News Steve Bannon nicht mehr Mitglied im US-Si~ <chr [25]> 
  4 A_Schillhaneck "RT @BA_Mitte_Berlin: Reminder: Bis Freitag läuft noch die~ <chr [2,11~
  5 Achim_P        "RT @spdmilk: .@Achim_P Dieses Wahljahr ist kein normales ~ <chr [138]>
  6 AdolfKessel1   "RT @CDUFraktionRLP: @AdolfKessel1 zur rot-grünen Flüchtli~ <chr [2]>  

The "mentions" column is a list of strings, which looks like this (for the first three rows):

   [[1]]
   character(0)

   [[2]]
   [1] "@MartinSchulz"    "@MartinSchulz"    "@MartinSchulz"    "@ManuelaSchwesig"
   [5] "@sigmargabriel"   "@nahlesMeine"     "@Willy"          

   [[3]]
   [1] "@NSC_CPMR"        "@SouthendRNLI"    "@weserkurier"     "@werderbremen"   
   [5] "@ribasdiego10"    "@boerseARD"       "@Europarl_DE"     "@Europarl_DE"    
   [9] "@SteffiD"         "@HBBuergerschaft" "@werderbremen"    "@RathausHB_news" 
   [13] "@UniBremen"       "@SPDEuropa"       "@Europarl_DE"     "@HBBuergerschaft"
   [17] "@amnestyusa"      "@SPDEuropa"       "@SPD"             "@HBBuergerschaft"

As output for the second row for example i want:

> paste(politicans_v2$mentions[[2]],collapse=" ")
 [1] "@MartinSchulz @MartinSchulz @MartinSchulz @ManuelaSchwesig @sigmargabriel @nahlesMeine @Willy"

So my paste method is working. But how do i iterate through the whole dataset. I have already tried this, but this gives me "NA":

for(i in 1:nrow(politicans_v2)) {
   paste(politicans_v2$mentions[[i]],collapse=" ")
}

Does anyone have a solution for this? Thanks for your answers!

2 Answers

Base R using sapply :

politicans_v2$mentions_chr <- sapply(politicans_v2$mentions, paste0, collapse = ' ')

You can do it with purrr like this

library(dplyr)
library(purrr)

# map return a list
map(sample$mentions, .f = paste, collapse=" ")
#> [[1]]
#> [1] ""
#> 
#> [[2]]
#> [1] "@MartinSchulz @MartinSchulz @MartinSchulz @ManuelaSchwesig @sigmargabriel @nahlesMeine @Willy"
#> 
#> [[3]]
#> [1] "@NSC_CPMR @SouthendRNLI @weserkurier @werderbremen @ribasdiego10 @boerseARD @Europarl_DE @Europarl_DE @SteffiD @HBBuergerschaft @werderbremen @RathausHB_news @UniBremen @SPDEuropa @Europarl_DE @HBBuergerschaft @amnestyusa @SPDEuropa @SPD @HBBuergerschaft"

# map_chr return a vector of character instead of a list
map_chr(sample$mentions, .f = paste, collapse=" ")
#> [1] ""                                                                                                                                                                                                                                                              
#> [2] "@MartinSchulz @MartinSchulz @MartinSchulz @ManuelaSchwesig @sigmargabriel @nahlesMeine @Willy"                                                                                                                                                                 
#> [3] "@NSC_CPMR @SouthendRNLI @weserkurier @werderbremen @ribasdiego10 @boerseARD @Europarl_DE @Europarl_DE @SteffiD @HBBuergerschaft @werderbremen @RathausHB_news @UniBremen @SPDEuropa @Europarl_DE @HBBuergerschaft @amnestyusa @SPDEuropa @SPD @HBBuergerschaft"

Created on 2021-05-18 by the reprex package (v2.0.0)

A sample data created using OP

sample <- tibble(Screen.name = c("_A_K_K_", "A_Gloeckner", "a_grotheer"),
  mentions = list(character(), 
    c("@MartinSchulz", "@MartinSchulz", "@MartinSchulz", "@ManuelaSchwesig", 
      "@sigmargabriel", "@nahlesMeine", "@Willy"),
    c("@NSC_CPMR","@SouthendRNLI", "@weserkurier", "@werderbremen",
      "@ribasdiego10", "@boerseARD", "@Europarl_DE", "@Europarl_DE",
      "@SteffiD", "@HBBuergerschaft", "@werderbremen", "@RathausHB_news",
      "@UniBremen", "@SPDEuropa", "@Europarl_DE", "@HBBuergerschaft",
      "@amnestyusa", "@SPDEuropa", "@SPD", "@HBBuergerschaft")))
Related