如何使用 dplyr 计算嵌套 data_frames 中的行数
How to count rows in nested data_frames with dplyr
这是一个愚蠢的示例数据框:
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"
怎么了?
与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
你可以这样做:
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
结合 dplyr
和 purrr
你可以做:
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_*
系列,因为您需要对列表进行操作。
这是一个愚蠢的示例数据框:
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"
怎么了?
与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
你可以这样做:
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
结合 dplyr
和 purrr
你可以做:
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_*
系列,因为您需要对列表进行操作。