代码之家  ›  专栏  ›  技术社区  ›  spore234

map函数中的第二个参数

  •  1
  • spore234  · 技术社区  · 6 年前

    我有一个这样的藏书:

    uuu <- structure(list(Id = c("a", "b"),
                          lists = list(c(1:2), c(100:103))
    ),
    .Names = c("Id", "lists"),
    row.names = c(NA, 2L), class = c("tbl_df", "tbl", "data.frame"))
    
    > uuu
    # A tibble: 2 x 2
      Id    lists    
    * <chr> <list>   
    1 a     <int [2]>
    2 b     <int [4]>
    

    在本例中,它有2行和2列,第一列是一个字符列,名为 id 第二列叫做 lists 包含整数列表。

    现在我想在列表元素上映射一个函数,例如 sqrt 功能:

    res <- uuu %>% mutate(res = map(lists, sqrt))
    
    > res
    # A tibble: 2 x 3
      Id    lists     res      
      <chr> <list>    <list>   
    1 a     <int [2]> <dbl [2]>
    2 b     <int [4]> <dbl [4]>
    

    res 现在有了一个新列,其中包含 平方正交函数 功能。

    现在我想在 物件 列,但我还希望有一个新列,指示从哪个列 身份证件 结果是。

    我可以这样列出结果:

    > unlist(res$res)
    [1]  1.000000  1.414214 10.000000 10.049876 10.099505 10.148892
    

    但我真正想要的是这样的东西(这里是手动操作的例子):

    res2 <- data.frame(res = unlist(res$res),
                ids = c(rep("a", 2), rep("b", 4)))
    
    > res2
            res ids
    1  1.000000   a
    2  1.414214   a
    3 10.000000   b
    4 10.049876   b
    5 10.099505   b
    6 10.148892   b
    

    理想情况下,如果可能的话,我希望在映射部分直接传递这个,对于定义自己函数的情况,如下所示:

    res <- uuu %>% mutate(res = map(lists, my_sqrt, id = id))
    

    在哪里? my_sqrt 是这样的:

    my_sqrt <- function(x, id) return(sqrt(x), id)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   akrun    6 年前

    unnest

    library(tidyverse)
    res %>% 
      select(-lists) %>%
      unnest