2017-09-13 2 views
0

J'utilise la fonction lapply pour appeler l'API de Spotify. J'ai une colonne d'albumids et je veux récupérer les noms de pistes de chaque albumid. La façon dont je l'ai fait était en séparant l'albumid dans un vecteur de caractères, puis en exécutant et en utilisant la fonction lapply pour appeler chaque valeur dans le vecteur de caractères. Le problème avec ceci est que je ne peux pas remettre cela dans l'image originale.Lapply vecteur de caractère de retour à l'image originale

Voici un exemple:

J'ai un dataframe qui ressemble à ceci:

df 
       Artist ID Artist Name  Album Name    Album IDs 
1 5lDUVqxXYEOAf12p0N2kVT Jared Dylan  We Can't 16PsUE4xzqxIvmNIlwQzmK 
2 5lDUVqxXYEOAf12p0N2kVT Jared Dylan Love Is a Game 4NYvHAON7Zo4KC2BMn5rlI 
3 5lDUVqxXYEOAf12p0N2kVT Jared Dylan Enjoy the View 5AipKv8MFdERzk9xxEN3OK 
4 5lDUVqxXYEOAf12p0N2kVT Jared Dylan Luna Loves Me 3u4XXqFOiltaNXyKAhkzGN 
5 5lDUVqxXYEOAf12p0N2kVT Jared Dylan  Symphony 0x5PQLx5tFNEpfhQnXhU8t 
6 5lDUVqxXYEOAf12p0N2kVT Jared Dylan In Panic EP 02mIkCCHDYzJWDzh0DDs5g 

J'ai ensuite créé un vecteur de caractères de la colonne ID album comme ci-dessous:

spotify<-df$`Album IDs` 

Ensuite, j'ai créé une fonction pour récupérer les trackids, artistid, nom de l'artiste, et les noms de piste pour chaque ID de l'album:

get.tracks <- function(spotify){ 
    albumTracksURL <- paste("https://api.spotify.com/v1/albums/", spotify, "/tracks?limit=50", sep="") 
    getTracks <- GET(albumTracksURL, add_headers(Authorization = HeaderValue)) 
    albumTracks <- jsonlite::fromJSON(toJSON(content(getTracks))) 

    ids <- data.frame(matrix(unlist(albumTracks$items$id), 
         nrow=albumTracks$total, byrow=T),stringsAsFactors=FALSE) 

    names <- data.frame(matrix(unlist(albumTracks$items$name), 
         nrow=albumTracks$total, byrow=T),stringsAsFactors=FALSE) 
    artists<-albumTracks$items$artists 
    artists1<-do.call(rbind, lapply(artists, function(x) do.call(cbind, lapply(x[c('id', 'name')], toString)))) 

    result <- cbind(ids, names, artists1) 

    colnames(result) <- c("ID", "NAME", "ARTIST ID", "ARTIST NAME") 

    return(result) 
} 

df <- lapply(spotify, get.tracks) 

result <- do.call(rbind, df) 
result_final<-result 

Voici ce que ce résultat ressemble à:

result_final 

         ID    NAME    ARTIST ID ARTIST NAME 
1 2YjOdgzqMIokknjOLS9ksc   We Can't 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
2 5zSJepyr4V94yICIwhEBNK Love Is a Game 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
3 4o7qeWp4eQflplPVtoiJhM Enjoy the View 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
4 4LtSJDlu8UvM4hNlJsSj31 Luna Loves Me 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
5 4a91BtkczDVQdgKWUiwuyy   Symphony 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
6 36XHtu9IgcoUEylPDYfPpr   In Panic 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
7 6LEgJv1ClgvjDzmr7WG4hE   Mistakes 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
8 5GxzbBprsHtk05qQeATGZR Ready, Set, Stun 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
9 1PHIPb4HyaatPqQfw2t288 Drive Me Crazy 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
10 6M9hgVrs4oj4YCFdXod1u4 Always Faithful 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 

Le problème est que je ne peux pas raconterai revenir à l'origine dataframe car il n'y a pas de clé primaire (ALBUMID). Je pense que je dois faire une fonction for-loop ou une fonction apply différente sur la df originale au lieu de la séparer en tant que vecteur de caractère mais je ne sais pas comment faire ça. L'objectif est de rendre le look résultat final comme celui-ci ci-dessous:

   Artist.ID Artist.Name  Album.Name    Album.IDs      ID    NAME    ARTIST.ID ARTIST.NAME 
1 5lDUVqxXYEOAf12p0N2kVT Jared Dylan  We Can't 16PsUE4xzqxIvmNIlwQzmK 2YjOdgzqMIokknjOLS9ksc   We Can't 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
2 5lDUVqxXYEOAf12p0N2kVT Jared Dylan Love Is a Game 4NYvHAON7Zo4KC2BMn5rlI 5zSJepyr4V94yICIwhEBNK Love Is a Game 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
3 5lDUVqxXYEOAf12p0N2kVT Jared Dylan Enjoy the View 5AipKv8MFdERzk9xxEN3OK 4o7qeWp4eQflplPVtoiJhM Enjoy the View 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
4 5lDUVqxXYEOAf12p0N2kVT Jared Dylan Luna Loves Me 3u4XXqFOiltaNXyKAhkzGN 4LtSJDlu8UvM4hNlJsSj31 Luna Loves Me 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
5 5lDUVqxXYEOAf12p0N2kVT Jared Dylan  Symphony 0x5PQLx5tFNEpfhQnXhU8t 4a91BtkczDVQdgKWUiwuyy   Symphony 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
6 5lDUVqxXYEOAf12p0N2kVT Jared Dylan In Panic EP 02mIkCCHDYzJWDzh0DDs5g 36XHtu9IgcoUEylPDYfPpr   In Panic 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
7 5lDUVqxXYEOAf12p0N2kVT Jared Dylan In Panic EP 02mIkCCHDYzJWDzh0DDs5g 6LEgJv1ClgvjDzmr7WG4hE   Mistakes 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
8 5lDUVqxXYEOAf12p0N2kVT Jared Dylan In Panic EP 02mIkCCHDYzJWDzh0DDs5g 5GxzbBprsHtk05qQeATGZR Ready, Set, Stun 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
9 5lDUVqxXYEOAf12p0N2kVT Jared Dylan In Panic EP 02mIkCCHDYzJWDzh0DDs5g 1PHIPb4HyaatPqQfw2t288 Drive Me Crazy 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 
10 5lDUVqxXYEOAf12p0N2kVT Jared Dylan In Panic EP 02mIkCCHDYzJWDzh0DDs5g 6M9hgVrs4oj4YCFdXod1u4 Always Faithful 5lDUVqxXYEOAf12p0N2kVT Jared Dylan 

Répondre

1

A la fin de votre fonction get.tracks ajouter une colonne pour l'album.

... 
colnames(result) <- c("ID", "NAME", "ARTIST ID", "ARTIST NAME") 
result$`Album IDs` <- spotify 
return(result) 

Ensuite, vous pouvez fusionner de nouveau dans l'original en utilisant Album IDs comme la clé.

+0

Merci, je ne savais pas que c'était aussi simple. Appréciez-le –