如何使用dplyr计算嵌套data_frames中的行数

时间:2017-05-04 15:54:57

标签: r dplyr split-apply-combine

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

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中每个嵌套data_frame中的行数。我认为这样可行:

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

出了什么问题?

3 个答案:

答案 0 :(得分:4)

结合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_* - 系列,因为你需要在列表上操作。

答案 1 :(得分:2)

你可以这样做:

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

答案 2 :(得分: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