【发布时间】:2018-10-03 16:36:13
【问题描述】:
我有一个如下的数据表。我想在“/”上拆分,对结果列表进行排序,获取唯一值,然后通过在 R 中的“/”上折叠来粘贴它。我想在 data.table 或 stringr 包中实现这一点。有可能吗?
输入>>
> dt<-data.table(id=c('id1','id2','id3','id4','id5'),value=c('a/b/a/b','b/a/c/a/b','c/d/c/a','a/b/b','a/a/c/b'))
> dt
id value
1: id1 a/b/a/b
2: id2 b/a/c/a/b
3: id3 c/d/c/a
4: id4 a/b/b
5: id5 a/a/c/b
预期输出>>
> dt
id value
1: id1 a/b
2: id2 a/b/c
3: id3 a/c/d
4: id4 a/b
5: id5 a/b/c
我尝试了以下方法,但没有成功。
> dt<-dt[,value1:=paste(sort(unique(unlist(strsplit(value, "/")))),collapse='/')]
> dt
id value value1
1: id1 a/b/a/b a/b/c/d
2: id2 b/a/c/a/b a/b/c/d
3: id3 c/d/c/a a/b/c/d
4: id4 a/b/b a/b/c/d
5: id5 a/a/c/b a/b/c/d
我也尝试过使用 list 并给出了正确的结果,但是如果数据表中其他变量的数量很大,这会变得很麻烦。
> dt<-dt[,list(value1=paste(sort(unique(unlist(strsplit(value,"/")))),collapse='/')),by=c('id','value')]
> dt
id value value1
1: id1 a/b/a/b a/b
2: id2 b/a/c/a/b a/b/c
3: id3 c/d/c/a a/c/d
4: id4 a/b/b a/b
5: id5 a/a/c/b a/b/c
有没有更简单的方法来做到这一点?
【问题讨论】:
-
欢迎来到 Stack Overflow!请带上tour 并通读help center,特别是如何提问。你最好的选择是做你的研究,搜索关于 SO 的相关主题,然后试一试。在进行更多研究和搜索后,发布您的尝试Minimal, Complete, and Verifiable example,并具体说明您遇到的问题,这可以帮助您获得更好的答案。
标签: r split data.table unique