r - 使用 dplyr 聚合不在组中的值
问题描述
考虑一个捕获与给定集群/特征对关联的值的数据框:
library(tidyverse)
set.seed(100)
X <- data_frame(Cluster = rep(1L:3L,2),
Feature = rep(c("A","B"), each=3),
Values = map(rep(11:13,2), rnorm) )
# # A tibble: 6 x 4
# Cluster Feature Values
# <int> <chr> <list>
# 1 1 A <dbl [11]>
# 2 2 A <dbl [12]>
# 3 3 A <dbl [13]>
# 4 1 B <dbl [11]>
# 5 2 B <dbl [12]>
# 6 3 B <dbl [13]>
我有兴趣为任何给定的集群/特征对创建一个新列,该列合并其他集群中该特征的所有值。例如,此类不在集群 (NIC) 列中的第一个条目应包含与集群 2 和 3 中的特征 A 关联的 25 个值。
以下对行的循环将产生正确的答案:
X$NIC <- map( 1:nrow(X), ~c() )
for(i in 1:nrow(X) ) {
cl <- X$Cluster[i]
f <- X$Feature[i]
X$NIC[[i]] <- filter( X, Cluster != cl, Feature == f ) %>%
pull(Values) %>% unlist
}
# # A tibble: 6 x 4
# Cluster Feature Values NIC
# <int> <chr> <list> <list>
# 1 1 A <dbl [11]> <dbl [25]>
# 2 2 A <dbl [12]> <dbl [24]>
# 3 3 A <dbl [13]> <dbl [23]>
# 4 1 B <dbl [11]> <dbl [25]>
# 5 2 B <dbl [12]> <dbl [24]>
# 6 3 B <dbl [13]> <dbl [23]>
## Spot-checking
with( X, identical(NIC[[1]], unlist(Values[2:3])) ) # TRUE
with( X, identical(NIC[[5]], unlist(Values[c(4,6)])) ) # TRUE
我想知道是否有更清洁的方法可以使用dplyr
工具来做到这一点。我觉得这是一个完美的group_by
解决方案设置,但似乎需要在组之间进行一些“串扰”才能使其工作。
解决方案
关键是不要按 分组Cluster
,因为您想迭代 Features 中的集群。
library(dplyr)
library(purrr)
mutate(group_by(X, Feature),
NIC = map(1:n(), ~ flatten_dbl(Values[-.])))
# # A tibble: 6 x 4
# # Groups: Feature [2]
# Cluster Feature Values NIC
# <int> <chr> <list> <list>
# 1 1 A <dbl [11]> <dbl [25]>
# 2 2 A <dbl [12]> <dbl [24]>
# 3 3 A <dbl [13]> <dbl [23]>
# 4 1 B <dbl [11]> <dbl [25]>
# 5 2 B <dbl [12]> <dbl [24]>
# 6 3 B <dbl [13]> <dbl [23]>
推荐阅读
- c++ - 没有合适的用户定义转换
到多图 - c - 使用循环 to 和 atof 使超过一万个 str 加倍,但在 C 程序中只有少数工作
- c - 问题在链表中的特定位置插入节点
- android - Custom BaseAdapter 上的第一项未显示在 Gridview 上,并且 Gridview 上的 ClickListener 不起作用
- css - &:hover 不适用于带有 SCSS 的悬停元素内的元素
- c# - 第一次后无法在datagridview单元格C#中输入浮点数(在为每一行计算小计之后)
- python - 获取在其列中具有匹配值的两个数组的行的有效方法
- posix - 为什么GNU tar --format=pax 会生成ustar 档案?
- ruby-on-rails - 带有 facebook 的 Rails 6 omniauth 在本地工作,但不适用于 heroku
- python - 在类中检查 Python 中的函数调用