【问题标题】:R split,sort,unique,paste in data tableR拆分,排序,唯一,粘贴在数据表中
【发布时间】: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

有没有更简单的方法来做到这一点?

【问题讨论】:

标签: r split data.table unique


【解决方案1】:

一种选择是按/ 拆分“值”,按“id”分组,得到sorted unique 值和paste 一起

dt[, .(value = paste(sort(unique(unlist(strsplit(value, "/")))), collapse="/")), id]
#    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

如果有很多列,那么我们可以通过循环遍历split 元素并在每个list 中执行sort/unique/paste 来更新“值”

dt[, value := unlist(lapply(strsplit(value, "/"), 
        function(x) paste(sort(unique(x)), collapse="/")))]

【讨论】:

  • 这可以正常工作,但是有没有更简单的方法而不必将“id”作为 by 变量提及?在实际的数据集中,我有很多字段,不得不将它们全部作为一个变量来提及是很麻烦的。
  • 你能用一个例子来编辑你的问题吗?例如,您想折叠id 的其他变量,或者其他分组变量也适用于value
  • @Amit 抱歉,我错过了这条消息。更新了帖子
猜你喜欢
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 2014-11-13
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多