将个人级别数据分组到分组级别列表中,并在列表中搜索%的存在百分比

时间:2017-07-31 02:50:15

标签: r list dataframe

在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中向量的元素,列表A中的向量存在于列表B中的向量上。是否存在基于此SubVector逻辑的合并命令?

4 个答案:

答案 0 :(得分:4)

完成第一次转型,

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

所有这一切都说明你的&#34;更广泛地&#34;似乎在寻找别的东西,我担心这不是我通过回答这两个具体问题而帮助你的。也许你可以提供另一个例子?

答案 1 :(得分: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的回答,你所做的分析并不需要这个中间数据。表。

答案 2 :(得分:1)

使用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)

答案 3 :(得分:1)

我们也可以使用dplyr

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