代码之家  ›  专栏  ›  技术社区  ›  Antoine C.

dpylr-嵌套列表中的元素式摘要

  •  2
  • Antoine C.  · 技术社区  · 5 年前

    我有以下内容 data.frame :

    df <- data.frame(X1 = c(1,2,2))
    df$X2 <- list(list(1, 2), list(0, 1), list(1,0))
    
    df
      X1    X2
    1  1  1, 2
    2  2  0, 1
    3  2  1, 0
    

    现在,我想添加一个新列,它是中所有列表的元素含义。 X2 共享相同的 X1 值,例如:

      X1  mean
    1  1  1, 2
    2  2  0.5, 0.5
    

    我按照以下说明进行了尝试:

    df %>% group_by(X1) %>% summarise(mean = mean(X2))
    

    但我得到的只是

         X1  mean
      <dbl> <dbl>
    1  1.00    NA
    2  2.00    NA
    Warning messages:
    1: In mean.default(X2) : argument is not numeric or logical: returning NA
    

    我怎样才能建立这个新专栏?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Julius Vainora    5 年前

    我们可以使用

    df <- df %>% group_by(X1) %>% 
      summarise(mean = list(map(reduce(X2, `map2`, `+`), `/`, n())))
    df$mean
    # [[1]]
    # [[1]][[1]]
    # [1] 1
    #
    # [[1]][[2]]
    # [1] 2
    #
    #
    # [[2]]
    # [[2]][[1]]
    # [1] 0.5
    #
    # [[2]][[2]]
    # [1] 0.5
    

    解释 :首先,分组后,使用

    reduce(X2, `map2`, `+`)
    

    我们按顺序添加所有列表元素。为了达到目的,我们用另一种方法 map 具有 / . 最后, list 返回一个列表。

    更新 :您也可以使用

    df %>% group_by(X1) %>%
      summarise(mean = list(pmap(X2, ~ sum(...) / n())))
    

    df %>% group_by(X1) %>%
      summarise(mean = list(pmap(X2, ~ mean(c(...)))))
    

    不幸地 list(pmap(X2, mean)) 不起作用

    mean(1, 2)
    # [1] 1