提问者:小点点

使用dplyr/mutate修复R中不兼容的类型错误


我正在尝试在R中使用tidyverse/dplyr包来处理数据,包括对在线API(来自Altrics)的向量化调用,以使用mutate添加行。

我可以创建的重现错误的最小代码如下。我得到错误“错误:不兼容的类型,期望数字向量”

library(tidyverse)
library(jsonlite)

fromJSON_wrapper <- function(x,y) {
  fromJSON(x)[[c(y)]]
}

toy <- tibble(
      doi = c("10.1002/anie.201500251", "10.1080/19443994.2015.1005695", "10.1007/s13721-015-0095-0"), 
      url = c("https://api.altmetric.com/v1/doi/10.1002/anie.201500251", "https://api.altmetric.com/v1/doi/10.1080/19443994.2015.1005695", "https://api.altmetric.com/v1/doi/10.1080/19443994.2015.1005695")
      )

extracted <- toy %>% rowwise() %>% mutate(score = fromJSON_wrapper(url,"score"))

下面提取单个分数的代码可以工作,无论是使用包装器还是单行tibble,我不确定为什么我的代码不起作用。

fromJSON_wrapper("https://api.altmetric.com/v1/doi/10.1007/s13721-015-0095-0")
extracted <- toy[1,] %>% rowwise() %>% mutate(score = fromJSON_wrapper(url, "score"))

任何建议将不胜感激。


共1个答案

匿名用户

只需遍历URL向量并提取所需内容就更简单了。purrr::map_dbl使这变得简单,尽管s应用也可以正常工作。

library(tidyverse)

toy <- tibble(
    doi = c("10.1002/anie.201500251", "10.1080/19443994.2015.1005695", "10.1007/s13721-015-0095-0"), 
    url = c("https://api.altmetric.com/v1/doi/10.1002/anie.201500251", "https://api.altmetric.com/v1/doi/10.1080/19443994.2015.1005695", "https://api.altmetric.com/v1/doi/10.1080/19443994.2015.1005695")
)

extracted <- toy %>% mutate(score = map_dbl(url, ~jsonlite::fromJSON(.x)$score))

extracted %>% select(doi, score)
#> # A tibble: 3 × 2
#>                             doi score
#>                           <chr> <dbl>
#> 1        10.1002/anie.201500251  0.25
#> 2 10.1080/19443994.2015.1005695  1.00
#> 3     10.1007/s13721-015-0095-0  1.00