Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.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 熔化数据表和分割值_R_Data.table - Fatal编程技术网

R 熔化数据表和分割值

R 熔化数据表和分割值,r,data.table,R,Data.table,我在一个数据表中有一列,它是由逗号分隔的值组成的列表 dt = data.table( a = c('a','b','c'), b = c('xx,yy,zz','mm,nn','qq,rr,ss,tt')) > dt a b 1: a xx,yy,zz 2: b mm,nn 3: c qq,rr,ss,tt 我想把它转换成一个长格式 a b 1: a xx 2: a yy 3: a zz 4: b mm 5: b nn 6: c qq

我在一个数据表中有一列,它是由逗号分隔的值组成的列表

dt = data.table( a = c('a','b','c'), b = c('xx,yy,zz','mm,nn','qq,rr,ss,tt'))
> dt
   a           b
1: a    xx,yy,zz
2: b       mm,nn
3: c qq,rr,ss,tt
我想把它转换成一个长格式

   a  b
1: a xx
2: a yy
3: a zz
4: b mm
5: b nn
6: c qq
7: c rr
8: c ss
9: c tt

对于数据帧,已回答此问题。我想知道是否有一个优雅的数据表解决方案。

以下内容适用于您的示例:

dt[, c(b=strsplit(b, ",")), by=a]
   a b
1: a xx
2: a yy
3: a zz
4: b mm
5: b nn
6: c qq
7: c rr
8: c ss
9: c tt

如果重复“by”变量,此方法将失败,如中所示

dt = data.table(a = c('a','b','c', 'a'),
                b = c('xx,yy,zz','mm,nn','qq,rr,ss,tt', 'zz,gg,tt'))
在这种情况下,可以使用
paste
使用相同的分组变量(a)折叠所有观测值,并将结果提供给上面的代码,从而得到一个健壮的解决方案

dt[, .(b=paste(b, collapse=",")), by=a][, c(b=strsplit(b, ",")), by=a]
这是回报

    a  b
 1: a xx
 2: a yy
 3: a zz
 4: a zz
 5: a gg
 6: a tt
 7: b mm
 8: b nn
 9: c qq
10: c rr
11: c ss
12: c tt

以下内容适用于您的示例:

dt[, c(b=strsplit(b, ",")), by=a]
   a b
1: a xx
2: a yy
3: a zz
4: b mm
5: b nn
6: c qq
7: c rr
8: c ss
9: c tt

如果重复“by”变量,此方法将失败,如中所示

dt = data.table(a = c('a','b','c', 'a'),
                b = c('xx,yy,zz','mm,nn','qq,rr,ss,tt', 'zz,gg,tt'))
在这种情况下,可以使用
paste
使用相同的分组变量(a)折叠所有观测值,并将结果提供给上面的代码,从而得到一个健壮的解决方案

dt[, .(b=paste(b, collapse=",")), by=a][, c(b=strsplit(b, ",")), by=a]
这是回报

    a  b
 1: a xx
 2: a yy
 3: a zz
 4: a zz
 5: a gg
 6: a tt
 7: b mm
 8: b nn
 9: c qq
10: c rr
11: c ss
12: c tt

我们可以
通过分隔符“,”(使用
strsplit
)拆分列“b”,按“a”分组,并使用
setnames将新列的名称,即“V1”设置为“b”

setnames(dt[, strsplit(b, ','), by = a], "V1", "b")[]
#   a  b
#1: a xx
#2: a yy
#3: a zz
#4: b mm
#5: b nn
#6: c qq
#7: c rr
#8: c ss
#9: c tt

如果“a”中有重复元素,如下面的示例所示

dt <- data.table(a = c('a','b','c', 'a'),
            b = c('xx,yy,zz','mm,nn','qq,rr,ss,tt', 'zz,gg,tt'))

注意:这两种方法都是
数据。表
方法我们可以
通过分隔符“,”(使用
strsplit
)拆分列“b”,按“a”分组,并使用
集合名将新列的名称,即“V1”设置为“b”

setnames(dt[, strsplit(b, ','), by = a], "V1", "b")[]
#   a  b
#1: a xx
#2: a yy
#3: a zz
#4: b mm
#5: b nn
#6: c qq
#7: c rr
#8: c ss
#9: c tt

如果“a”中有重复元素,如下面的示例所示

dt <- data.table(a = c('a','b','c', 'a'),
            b = c('xx,yy,zz','mm,nn','qq,rr,ss,tt', 'zz,gg,tt'))

注意:两种方法都是
数据。表
方法还有另一种方法,但此方法涉及另一个包:splitstackshape

library(splitstackshape)
cSplit(dt, "b", sep = ",", direction = "long")
   a  b
1: a xx
2: a yy
3: a zz
4: b mm
5: b nn
6: c qq
7: c rr
8: c ss
9: c tt

此函数使用data.table工作。即使我们对列“a”有多个相同的值,这项工作仍然有效。

还有另一种方法,但该方法涉及另一个包:splitstackshape

library(splitstackshape)
cSplit(dt, "b", sep = ",", direction = "long")
   a  b
1: a xx
2: a yy
3: a zz
4: b mm
5: b nn
6: c qq
7: c rr
8: c ss
9: c tt

此函数使用data.table工作。即使我们对列“a”有多个相同的值,这也可以工作。

您可以尝试
设置名称(dt[,strsplit(b',,'),a],“V1”,“b”)[]
您太快了。我想听听你的意见。我最初会接受你的评论作为答案,因为我是第一个。我认为公认的答案更为清晰。感谢您的快速回复!您可以尝试
setnames(dt[,strsplit(b',,'),a],“V1”,“b”)[]
您太快了。我想听听你的意见。我最初会接受你的评论作为答案,因为我是第一个。我认为公认的答案更为清晰。感谢您的快速回复!我熟悉使用“by”进行聚合和缩减。很有趣看到它被用于扩展。谢谢谢谢面对重复的ID,我添加了一个潜在的更健壮的解决方案。我发现这个答案的后半部分并不像这里所示的那样有效。我得到的是列
a
重复的a/b/c/ax3,而不是上面的模式。@moman822你是对的。我已经纠正了这一点,以提供一个适用于这种情况的实现。我熟悉使用“by”进行聚合和缩减。很有趣看到它被用于扩展。谢谢谢谢面对重复的ID,我添加了一个潜在的更健壮的解决方案。我发现这个答案的后半部分并不像这里所示的那样有效。我得到的是列
a
重复的a/b/c/ax3,而不是上面的模式。@moman822你是对的。我已经纠正了这一点,以提供一个适用于这种情况的实现。