【问题标题】:How to count rows in nested data_frames with dplyr如何使用 dplyr 计算嵌套 data_frames 中的行数
【发布时间】:2017-10-02 21:58:09
【问题描述】:

这是一个愚蠢的示例数据框:

df <- data_frame(A = c(rep(1, 5), rep(2, 4)), B = 1:9) %>% 
  group_by(A) %>% 
  nest()

看起来像这样:

> df
# A tibble: 2 × 2
      A             data
  <dbl>           <list>
1     1 <tibble [5 × 1]>
2     2 <tibble [4 × 1]>

我想添加名为N 的第三列,其条目等于data 中每个嵌套数据帧中的行数。我认为这会起作用:

> df %>% 
+   mutate(N = nrow(data))
Error: Unsupported type NILSXP for column "N"

怎么了?

【问题讨论】:

  • 试试这个:df$nRow &lt;- sapply(df$data, nrow)。您需要一次完成一个单元格。不能对整列数据框做nrow

标签: r dplyr split-apply-combine


【解决方案1】:

dplyr:

df %>% 
  group_by(A) %>%
  mutate(N = nrow(data.frame(data)))
      A             data     N
  <dbl>           <list> <int>
1     1 <tibble [5 × 1]>     5
2     2 <tibble [4 × 1]>     4

【讨论】:

    【解决方案2】:

    结合 dplyrpurrr 你可以这样做:

    library(tidyverse)
    
    df %>% 
      mutate(n = map_dbl(data, nrow))
    #> # A tibble: 2 × 3
    #>       A             data     n
    #>   <dbl>           <list> <dbl>
    #> 1     1 <tibble [5 × 1]>     5
    #> 2     2 <tibble [4 × 1]>     4
    

    我喜欢这种方法,因为您可以保持通常的工作流程,在 mutate 中创建一个新列,但利用 map_*-family,因为您需要对列表进行操作。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      df %>%
        rowwise() %>%
        mutate(N = nrow(data))
      

      这给出了:

      #Source: local data frame [2 x 3]
      #Groups: <by row>
      #
      ## A tibble: 2 × 3
      #      A             data     N
      #  <dbl>           <list> <int>
      #1     1 <tibble [5 × 1]>     5
      #2     2 <tibble [4 × 1]>     4
      

      【讨论】:

      • 与我上面提到的apply 系列相比,dplyr 解决方案中的解决方案非常好。我非常喜欢这个。
      猜你喜欢
      • 2016-10-10
      • 1970-01-01
      • 2014-05-11
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多