【问题标题】:Aggregating values NOT in group, with dplyr使用 dplyr 聚合不在组中的值
【发布时间】:2019-04-29 13:08:14
【问题描述】:

考虑一个捕获与给定集群/特征对关联的值的数据框:

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 解决方案的完美设置,但似乎需要在组之间进行一些“串扰”才能正常工作。

【问题讨论】:

    标签: r dplyr aggregate


    【解决方案1】:

    关键是不要Cluster 分组,因为您想在功能中迭代集群。

    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]>
    

    【讨论】:

    • 谢谢。这是一个非常优雅的解决方案!
    猜你喜欢
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多