【问题标题】:Lapply character vector back to original dataframe将字符向量应用回原始数据帧
【发布时间】:2017-09-13 17:29:05
【问题描述】:

我正在使用 lapply 函数来调用 Spotify 的 API。我有一列专辑,我想从每个专辑中检索曲目名称。我这样做的方法是将白蛋白分离成一个字符向量,然后运行并使用 lapply 函数调用字符向量中的每个值。问题在于我无法将其放回原始数据框中。

这是一个例子:

我有一个如下所示的数据框:

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

然后,我从专辑 ID 列创建了一个字符向量,如下所示:

spotify<-df$`Album IDs`

然后我创建了一个函数来检索每个专辑 ID 的曲目 ID、艺术家 ID、艺术家姓名和曲目名称:

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

这是这个结果的样子:

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

问题在于我无法将其与原始数据帧相关联,因为没有主键(专辑)。我认为我需要在原始 df 上执行一个 for 循环或不同的应用函数,而不是将其作为字符向量分离出来,但我不知道该怎么做。目标是使最终结果如下所示:

                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 function for-loop apply


    【解决方案1】:

    在函数get.tracks 的末尾添加一个相册列。

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

    然后你可以使用Album IDs作为键合并回原来的。

    【讨论】:

    • 谢谢,没想到这么简单。欣赏它
    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 2023-01-03
    • 2014-05-27
    • 2017-05-04
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多