Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从data.table';s分组方式_R_Data.table - Fatal编程技术网

R 从data.table';s分组方式

R 从data.table';s分组方式,r,data.table,R,Data.table,我试图从一个数据表的两列和任意数量的行中创建一个向量列表。与我正在使用的类似的示例数据表是: 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", "cat

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

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
不幸的是,即使我使用
b=“a,b”
,循环也无法正确组合行。相反,我得到的是:

    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
我希望的是:

    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
对都有一行。

由于它是一个小数据集,您可以将数据重塑为
数据。frame
并使用
plyr
对其进行汇总。这不是一个完整的解决方案,但应该让您开始:

> 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

data.frame
并使用
plyr
对其进行汇总。这不是一个完整的解决方案,但应该让您开始:

> 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

data.frame
并使用
plyr
对其进行汇总。这不是一个完整的解决方案,但应该让您开始:

> 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

data.frame
并使用
plyr
对其进行汇总。这不是一个完整的解决方案,但应该让您开始:

> 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

这就是你需要的吗

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> 
dt1)列表(c(粘贴0(“c(“,inv_flow”),其他列表(c(inv_flow))),by=“a,b”]
#a b库存流量
#1:1121,cat1
#2:2131,第二类
#3:3141,cat1
#4:415C(1类),c(2类,2类)
#5:4161,第三类
#6:3171,第二类
#7:5221,第1类
#8:7181,第二类
str(dt)
#类“data.table”和“data.frame”:8个obs。共有3个变量:
#$a:数字12344357
#$b:num 12 13 14 15 16 17 22 18
#$inv_流量:8个列表
#..$:chr“1类1”
#..$:chr“1类,2类”
#..$:chr“1类1”
#..$:chr“c(1类)”c(2类)
#..$:chr“1类,3类”
#..$:chr“1类,2类”
#..$:chr“1类1”
#..$:chr“1类,2类”
#-attr(*,“.internal.selfref”)=

这就是你需要的吗

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> 
dt1)列表(c(粘贴0(“c(“,inv_flow”),其他列表(c(inv_flow))),by=“a,b”]
#a b库存流量
#1:1121,cat1
#2:2131,第二类
#3:3141,cat1
#4:415C(1类),c(2类,2类)
#5:4161,第三类
#6:3171,第二类
#7:5221,第1类
#8:7181,第二类
str(dt)
#类“data.table”和“data.frame”:8个obs。共有3个变量:
#$a:数字12344357
#$b:num 12 13 14 15 16 17 22 18
#$inv_流量:8个列表
#..$:chr“1类1”
#..$:chr“1类,2类”
#..$:chr“1类1”
#..$:chr“c(1类)”c(2类)
#..$:chr“1类,3类”
#..$:chr“1类,2类”
#..$:chr“1类1”
#..$:chr“1类,2类”
#-attr(*,“.internal.selfref”)=

这就是你需要的吗

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> 
dt1)列表(c(粘贴0(“c(“,inv_flow”),其他列表(c(inv_flow))),by=“a,b”]
#a b库存流量
#1:1121,cat1
#2:2131,第二类
#3:3141,cat1
#4:415C(1类),c(2类,2类)
#5:4161,第三类
#6:3171,第二类
#7:5221,第1类
#8:7181,第二类
str(dt)
#类“data.table”和“data.frame”:8个obs。共有3个变量:
#$a:数字12344357
#$b:num 12 13 14 15 16 17 22 18
#$inv_流量:8个列表
#..$:chr“1类1”
#..$:chr“1类,2类”
#..$:chr“1类1”
#..$:chr“c(1类)”c(2类)
#..$:chr“1类,3类”
#..$:chr“1类,2类”
#..$:chr“1类1”
#..$:chr“1类,2类”
#-attr(*,“.internal.selfref”)=

这就是你需要的吗

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> 
dt1)列表(c(粘贴0(“c(“,inv_flow”),其他列表(c(inv_flow))),by=“a,b”]
#a b库存流量
#1:1121,cat1
#2:2131,第二类
#3:3141,cat1
#4:415C(1类),c(2类,2类)
#5:4161,第三类
#6:3171,第二类
#7:5221,第1类
#8:7181,第二类
str(dt)
#类“data.table”和“data.frame”:8个obs。共有3个变量:
#$a:数字12344357
#$b:num 12 13 14 15 16 17 22 18
#$inv_流量:8个列表
#..$:chr“1类1”
#..$:chr“1类,2类”
#..$:chr“1类1”
#..$:chr“c(1类)”c(2类)
#..$:chr“1类,3类”
#..$:chr“1类,2类”
#..$:chr“1类1”
#..$:chr“1类,2类”
#-attr(*,“.internal.selfref”)=


您的
dt
有行
a、b、d、e
,但您在代码中引用了
dt$c
。是哪一个?你的陈述似乎不清楚,你也没有说想要什么结果。根据第一列的值,我可以确定您想要某种聚合。试图读取代码的意图是困难的。。。特别是当它不是成功的代码时。你能提供一个你想要的输出的例子吗?@jlhoward-Fixed!谢谢你的提醒。@semerj-我已经添加了我想要的输出,但是如果你需要更多信息,请告诉我。你的
dt
a、b、d、e行,但是你在代码中引用了
dt$c
。是哪一个?你的陈述似乎不清楚,你也没有说想要什么结果。根据第一列的值,我可以确定您想要某种聚合。试图读取代码的意图是困难的。。。特别是当它不是成功的代码时。你能提供一个你想要的输出的例子吗?@jlhoward-Fixed!谢谢你的提醒。@semerj-我已经添加了我想要的输出,但是如果你需要更多信息,请告诉我。你的
dt
a、b、d、e行,但是你在代码中引用了
dt$c
。是哪一个?你的陈述似乎不清楚,你也没有说想要什么结果。根据第一列的值,我可以确定您想要某种聚合。试图读取代码的意图是困难的。。。特别是当它不是成功的代码时。你能提供一个你想要的输出的例子吗?@jlhoward-Fixed!谢谢你的提醒。@semerj-我补充了什么