【问题标题】:Run purrr::map_dfr on dataframe rows?在数据框行上运行 purrr::map_dfr?
【发布时间】:2019-07-27 20:39:37
【问题描述】:

给定一个dataframe,比如iris默认值,如何配置purrr::map_dfr()函数在dataframe的每一行上运行并执行函数foo

这是我的 df 的一行,请注意该值始终是一个很大的 JSON:

structure(list(Key = "2019/01/04/14/kuku@pupu.com_2ed026cb-8e9f-4392-9cc4-9f580b9d3aab_1345a5a4-3d5b-48a0-a678-67ed09a6f487_2019-01-04-14-52-43-537", 
    LastModified = "2019-01-04T14:52:44.000Z", ETag = "\"1c6269ab8b7baa85f0d2567de417f0d0\"", 
    Size = 35280, Owner = "e7c0d260939d15d18866126da3376642e2d4497f18ed762b608ed2307778bdf1", 
    StorageClass = "STANDARD", Bucket = "comp-kukupupu-streamed-data", 
    user_name = "kuku@pupu.com", value = list(---here goes a large json), 
    obs_id = 1137L), row.names = 1L, class = "data.frame")

我的功能是:

extract_scroll_data <- function(df) {

  tryCatch({

    j <- fromJSON(unlist(df$value))

    if (is_empty(fromJSON(j$sensorsData)) | is_empty(fromJSON(j$eventList))) {

      return(tibble())

    } else {

      return(set_names(as_tibble(fromJSON(j$eventList, bigint_as_char = TRUE), 
                                 .name_repair = "unique"), 
                       nm = c("time_stamp", 
                              "x", "y", "size", 
                              "pressure", "scroll", "state")) %>%
               dplyr::mutate("user_name" = df$user_name,
                             "obs_id" = df$obs_id))
    }

  }, warning = function(war) {

    # Warning handler picks up where error was generated:
    print(paste0("Warning: occured at ", df$obs_id, war))

  }, error = function(err) {

    # error handler picks up where error was generated
    print(paste0("Error: occured at ", df$obs_id, err))

  }, finally = {

    gc()

  })

}

请告知为什么它不使用数据框行?

【问题讨论】:

  • 只是map_dfr(iris, foo) ?适用于map_dfr(mtcars, sqrt),但我认为您正在寻找其他东西。你能详细解释一下foo 和预期的输出吗?
  • 为什么不直接使用 apply?应用(数据框,1,sd)
  • 别那样做。
  • @EsbenEickhardt 我将很快发布数据帧的头部和我使用的函数
  • 如果您的数据框太大而无法有效使用,有两种选择:1. 使用平面文件,并且当时只占用一点内存,2. 使用 SparkR包。

标签: r dataframe functional-programming purrr furrr


【解决方案1】:

map_dfr(),就像map 家族的任何其他成员迭代列表一样,data.frame 实际上是一个列列表。您可以通过typeof(iris)as.list(iris) 进行检查。要使 map_dfr() 迭代行,您必须使用 split() 函数将您的 data.frame 转换为行列表。

iris %>%
  split(1:nrow(.)) %>%
  purrr::map_dfr(do_stuff)

【讨论】:

  • 如何使用:furrr::future_pmap_dfr(list(data_df$user_name, data_df$obs_id, data_df$value), function(x, y, z) extract_scroll_data(x, y, z))
  • 应该也可以
  • 听起来像是extract_scroll_data 函数的问题。您确定,您将其调整为接受 3 个参数,而不仅仅是问题中的 data.frame
  • 我确实做到了。我认为问题在于,如果我使用带有 3 个向量列表的 pmap,它不会使用所有 3 个元素中的 1 个,然后是第二个,然后是第三个,但所有组合。
  • 嗯,应该的。试试这个代码来了解它的行为:pmap(list(c('a', 'b', 'c'), c('x', 'y', 'z')), paste)
猜你喜欢
  • 1970-01-01
  • 2018-09-14
  • 2020-06-09
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2021-08-16
相关资源
最近更新 更多