dplyr+purr: n() 是指 map() 组,而不是本地组?
dplyr+purr: n() refers to map() groups, not local groups?
我有一个 parent 数据集嵌套多个数据集(即每个单元格都是一个小标题的小标题),我希望每个数据集在其中找到每个组的行数。使用单个数据集的标准方法就是 group_by(var) %>% mutate(nrow=n())
。
但是现在我通过 map()
调用对多个数据集执行此操作,看起来 n()
调用指的是 map()
进行的(隐式)分组,而不是group_by
在我的本地数据集中进行显式分组?
单个数据集的标准方法,n()
returns 50:
iris %>%
group_by(., Species) %>%
mutate(nrow=n())
数据集的数据集:
df <- data_frame(name=c("a", "b"), Data=list(iris, iris))
df2 <- df %>%
mutate(Data2=map(Data, ~group_by(., Species) %>%
mutate(nrow=n()) %>%
ungroup()))
但现在 n()
返回了 2?
df2[1,]$Data2[[1]]
如果您在 mutate
之外定义函数,它可以正常工作(我假设此输出是您想要的...)
fun <- function(x) {
df <- group_by(x, Species) %>%
summarise(nrow = n())
}
df2 <- df %>%
mutate(Data2=map(Data, fun))
df2$Data2
# [[1]]
# # A tibble: 3 x 2
# Species nrow
# <fctr> <int>
# 1 setosa 50
# 2 versicolor 50
# 3 virginica 50
#
# [[2]]
# # A tibble: 3 x 2
# Species nrow
# <fctr> <int>
# 1 setosa 50
# 2 versicolor 50
# 3 virginica 50
从版本0.7.0
开始可用的另一个选项是使用add_count()
,它不会与map()
冲突,而且无论如何都简化了代码:
# standard case:
iris %>%
add_count(Species)
## df of df:
df2 <- df %>%
mutate(Data2=map(Data, ~add_count(., Species)))
我有一个 parent 数据集嵌套多个数据集(即每个单元格都是一个小标题的小标题),我希望每个数据集在其中找到每个组的行数。使用单个数据集的标准方法就是 group_by(var) %>% mutate(nrow=n())
。
但是现在我通过 map()
调用对多个数据集执行此操作,看起来 n()
调用指的是 map()
进行的(隐式)分组,而不是group_by
在我的本地数据集中进行显式分组?
单个数据集的标准方法,n()
returns 50:
iris %>%
group_by(., Species) %>%
mutate(nrow=n())
数据集的数据集:
df <- data_frame(name=c("a", "b"), Data=list(iris, iris))
df2 <- df %>%
mutate(Data2=map(Data, ~group_by(., Species) %>%
mutate(nrow=n()) %>%
ungroup()))
但现在 n()
返回了 2?
df2[1,]$Data2[[1]]
如果您在 mutate
之外定义函数,它可以正常工作(我假设此输出是您想要的...)
fun <- function(x) {
df <- group_by(x, Species) %>%
summarise(nrow = n())
}
df2 <- df %>%
mutate(Data2=map(Data, fun))
df2$Data2
# [[1]]
# # A tibble: 3 x 2
# Species nrow
# <fctr> <int>
# 1 setosa 50
# 2 versicolor 50
# 3 virginica 50
#
# [[2]]
# # A tibble: 3 x 2
# Species nrow
# <fctr> <int>
# 1 setosa 50
# 2 versicolor 50
# 3 virginica 50
从版本0.7.0
开始可用的另一个选项是使用add_count()
,它不会与map()
冲突,而且无论如何都简化了代码:
# standard case:
iris %>%
add_count(Species)
## df of df:
df2 <- df %>%
mutate(Data2=map(Data, ~add_count(., Species)))