首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从data.table的组中获取行

从data.table的组中获取行
EN

Stack Overflow用户
提问于 2014-08-14 16:44:33
回答 2查看 99关注 0票数 0

我试图从2列和数据表的任意行数创建一个向量列表。一个与我正在使用的示例数据表类似的例子是:

代码语言:javascript
复制
dt <- data.table(a = c(1,2,3,4,4,4,3,5,7), 
                 b=c(12,13,14,15,15,16,17,22,18),
                 c=c(1,1,1,1,2,1,1,1,1),
                 d=c("cat1", "cat2", "cat1", "cat1", "cat2", "cat3", "cat2", "cat1", "cat2"))


   a  b  c   d
 1: 1 12 1 cat1
 2: 2 13 1 cat2
 3: 3 14 1 cat1
 4: 4 15 1 cat1
 5: 4 15 2 cat2
 6: 4 16 1 cat3
 7: 3 17 1 cat2
 8: 5 22 1 cat1
 9: 7 18 1 cat2

我想使用by语句对行进行分组,然后使用函数创建列表。不过,我还没能把所有的事情都做好。我现在拥有的是:

代码语言:javascript
复制
create_kv <- function(x,y) {
  l <- list()
  i <- 1
  while (i <= length(x) & i <= length(y)) {
    each_c <- c(x[i], y[i])

    l[[i]] <- each_c
    i = i + 1
  }
  return(l)
}

for (each_a in unique(dt$a)) {
    for (each_b in dt[a == each_a,]$b) {
       ranks <- dt[a == each_a & b == each_b,]$c
       inv <- dt[a == each_a & b == each_b,]$d
       dt[a == each_a & b == each_b, `:=` (inv_flow = create_kv(ranks, inv))]
   }
}

不幸的是,即使我使用b="a,b",循环也不能正确地组合行。相反,我得到了:

代码语言:javascript
复制
    a  b c    d   inv_flow
 1: 1 12 1 cat1  1,cat1
 2: 2 13 1 cat2  1,cat2
 3: 3 14 1 cat1  1,cat1
 4: 4 15 1 cat1  1,cat1
 5: 4 15 2 cat2  2,cat2
 6: 4 16 1 cat3  1,cat3
 7: 3 17 1 cat2  1,cat2
 8: 5 22 1 cat1  1,cat1
 9: 7 18 1 cat2  1,cat1

我希望的是:

代码语言:javascript
复制
    a  b c    d   inv_flow
 1: 1 12 1 cat1  1,cat1
 2: 2 13 1 cat2  1,cat2
 3: 3 14 1 cat1  1,cat1
 4: 4 15 1 cat1  c(1,cat1), c(2,cat2)
 5: 4 16 1 cat3  1,cat3
 7: 3 17 1 cat2  1,cat2
 8: 5 22 1 cat1  1,cat1
 9: 7 18 1 cat2  1,cat1

因此,每一对a,b都有一行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-14 20:21:33

这就是你需要的吗?

代码语言:javascript
复制
dt <- dt[ , inv_flow := paste(c, d, sep=",")][, list(inv_flow = if (.N > 1) list(c(paste0("c(",inv_flow,")"))) else list(c(inv_flow))), by = "a,b"]

#   a  b            inv_flow
#1: 1 12              1,cat1
#2: 2 13              1,cat2
#3: 3 14              1,cat1
#4: 4 15 c(1,cat1),c(2,cat2)
#5: 4 16              1,cat3
#6: 3 17              1,cat2
#7: 5 22              1,cat1
#8: 7 18              1,cat2

str(dt)
# Classes ‘data.table’ and 'data.frame':  8 obs. of  3 variables:
# $ a       : num  1 2 3 4 4 3 5 7
# $ b       : num  12 13 14 15 16 17 22 18
# $ inv_flow:List of 8
# ..$ : chr "1,cat1"
# ..$ : chr "1,cat2"
# ..$ : chr "1,cat1"
# ..$ : chr  "c(1,cat1)" "c(2,cat2)"
# ..$ : chr "1,cat3"
# ..$ : chr "1,cat2"
# ..$ : chr "1,cat1"
# ..$ : chr "1,cat2"
# - attr(*, ".internal.selfref")=<externalptr> 
票数 3
EN

Stack Overflow用户

发布于 2014-08-14 19:12:03

因为它是一个小数据集,所以您可以将数据重组为data.frame并使用plyr对其进行总结。不是一个完整的解决方案,但应该让你开始:

代码语言:javascript
复制
> df <- data.frame(a = c(1,2,3,4,4,4,3,5,7), 
                   b=c(12,13,14,15,15,16,17,22,18),
                   c=c(1,1,1,1,2,1,1,1,1),
                   e=c("cat1", "cat2", "cat1", "cat1", "cat2", "cat3", "cat2", "cat1", "cat2"))
> df$e <- as.character(df$e)

# create index you'd like to group by
> df$ab <- paste(df$a, df$b)

> library(plyr)
> ddply(df, .(ab), summarize, f = list(e), g = list(c))

    ab          f    g
1 1 12       cat1    1
2 2 13       cat2    1
3 3 14       cat1    1
4 3 17       cat2    1
5 4 15 cat1, cat2 1, 2
6 4 16       cat3    1
7 5 22       cat1    1
8 7 18       cat2    1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25313339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档