【发布时间】:2019-10-01 22:40:51
【问题描述】:
我在将这个问题的逻辑与dplyr 的逻辑匹配时遇到了一点问题。通常,如果您想将一个组减少到每组一个数字,则使用summarise,而如果您想为每行计算一个单独的数字,则使用mutate。但是如果你想对每一行的组进行计算呢?
在下面的示例中,mloc 包含一个指向 pnum 的指针,目标是添加一个新列 nm_child,该列对于每一行计算指向的组中 mloc 值的数量到(即具有相同的值)pnum 中的行中组索引。如果我知道如何迭代 1) 每个组,& 2) 每个元素,& 3) 将映射输出作为组中的列返回,这将很容易使用嵌套循环或 map 来实现。
library(tidyverse)
ser <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2)
pnum <- c(1:5, 1:6)
mloc <- c(0, 2, 2, 0, 3, 1, 1, 0, 0, 3, 4)
tb1 <- tibble(ser,pnum, mloc)
tb2 <- tb1 %>%
group_by(ser) %>%
mutate(nm_child = sum(pnum == mloc))
上面的 nm_child 总是 = 1。我明白它为什么不起作用,但我不明白它为什么会这样做。
我也试过
mutate(nm_child = count(pnum == mloc))
(返回
no applicable method for 'groups' applied to an object of class "logical")
和其他各种东西。我确实通过为中间值添加几列并使用一堆嵌套的 ifelse() 来完成一件事,但是在我的 900 万行上运行需要超过 20 分钟 - 相比之下,例如回归,以及最简单的 dplyr 操作,这些操作在几秒钟之间变化,很快就无法注意到。
期望的输出:
tb2$nm_child = c(0, 2, 1, 0, 0, 2, 0, 1, 1, 0, 0)
【问题讨论】:
标签: r dictionary dplyr iteration tidyverse