4

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

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"

怎么了?

4

3 回答 3

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_*-family,因为您需要对列表进行操作。

于 2017-05-04T19:54:28.433 回答
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
于 2017-05-04T16:24:39.390 回答
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
于 2017-05-04T15:58:37.883 回答