【问题标题】:Group individual level data into grouped level list and search for presence %in% that list将单个级别数据分组到分组级别列表中并搜索该列表的存在 %in%
【发布时间】:2017-07-31 02:50:15
【问题描述】:

在 R 中我有一个双重问题。

首先,

我想从这里转换我的数据:

d <- data.table(
  person_id=1:10,
  cat=letters[1:10],
  group_id=c(rep(1,5),rep(2,5))
)

进入这个:

d_grouped <- data.table(
  group_id=1:2
)
d_grouped$Cat_grouped <- list(letters[1:5],letters[6:10] )

即将我的数据从个人级别分组到组级别,但将有关个人特征的信息保留在包含每个组的个人级别特征列表的列中。

如何进行这种聚合?

最好是 data.table 解决方案。但它也可能是一个普通的data.frame。

第二,

我想在每个组的每个列表中搜索向量元素的存在

类似的东西(我知道这是不正确的语法):

c('a','b') %in% d_grouped$Cat_grouped

应该返回另一个列表:

list(c(T,T),c(F,F))

更广泛地说,我正在尝试合并包含向量的列表(A 和 B)。匹配应该基于列表 A 中的向量元素存在于列表 B 中的向量上。是否有任何基于此 SubVector 逻辑的合并命令?

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    为了完成第一次转换,

    d[, list(Cat_grouped=paste0(cat, collapse = ',')), group_id]
    

    要完成第二个,您最好的选择似乎是将数据保留为原始形状?毕竟

    d[, c('a', 'b') %in% cat, group_id]
    

    返回

      group_id    V1
    1:        1  TRUE
    2:        1  TRUE
    3:        2 FALSE
    4:        2 FALSE
    

    所有这一切都说您“更广泛地”似乎在要求其他东西,我担心这不是我通过回答两个具体问题帮助您解决的问题。或许你可以再举一个例子?

    【讨论】:

    • 我认为您仅在当前形状下进行此分析是正确的。我不确定拆分成单独的列表有什么好处。
    • @HarlandMason:谢谢你的好答案。我在这个问题中描述了更广泛的问题。 stackoverflow.com/questions/45406977/… 。如果你能看一下,我会很感激
    【解决方案2】:

    只需在data.table 中执行此操作,为每个by= 组返回一个列表:

    d[, .(cat_grouped=.(cat)), by=group_id]
    #   group_id cat_grouped
    #1:        1   a,b,c,d,e
    #2:        2   f,g,h,i,j
    

    我倾向于同意@HarlandMason 的回答,即您正在进行的分析不需要这个中间数据表。

    【讨论】:

      【解决方案3】:

      使用aggregate 的基础 R 解决方案

      d2 = aggregate(list(cat = d$cat), list(group = d$group_id), function(x)
                                              as.character(x), simplify = FALSE)
      d2
      #  group           cat
      #1     1 a, b, c, d, e
      #2     2 f, g, h, i, j
      
      lapply(d2$cat, function(x) c("a","b") %in% x)
      #$`1`
      #[1] TRUE TRUE
      
      #$`2`
      #[1] FALSE FALSE
      

      同时考虑

      mylist = split(d$cat, d$group_id)
      

      【讨论】:

        【解决方案4】:

        我们也可以使用dplyr

        library(dplyr)
        d %>%
            group_by(group_id) %>% 
            summarise(cat = list(cat))
        

        【讨论】:

          猜你喜欢
          • 2023-03-18
          • 2021-01-28
          • 1970-01-01
          • 2017-11-18
          • 1970-01-01
          • 2019-11-17
          • 1970-01-01
          • 2019-11-09
          • 2019-07-23
          相关资源
          最近更新 更多