从数据帧中的嵌套列表中提取唯一元素

时间:2014-07-11 14:40:31

标签: r string list plyr

我有一个带有变量的data.frame,其中包含众多参与者的名字。参与者的名称都包含为一个(= 1)长字符串,其名称用逗号分隔。有些名字是重复的。我试着只给每个名字一次。

数据下方。

我将长串名称转换为列表:

b$s <- strsplit(b$participants, ",")

然后我删除了名称两边的空格以标准化它们。

library(stringr)
b.l <- unlist(b$s)
b.l <- str_trim(b.l, side="both")

从这个列表中我获取了唯一值

b.l <- unique(unlist(b.l))

结果是所有唯一名称:

"Takfir wa'l Hijra" "AIS" "GIA"  "AQIM" "MUJAO" "FLEC-R" "FLEC-FAC"  

但是,此列表包含所有唯一名称。我想仅针对每个ID(会话号)执行这些步骤,这也可能是重复的。

我尝试用ddply执行上面的操作,但无济于事。有什么建议?不幸的是,我对列表的处理不是很熟悉。

最终,数据框应如下所示:

id    unique.participants 
1-191 Takfir wa'l Hijra, AIS, GIA, AQIM, MUJAO 
1-191 Takfir wa'l Hijra, AIS, GIA, AQIM, MUJAO  
1-192 FLEC-R, FLEC-FAC 

非常感谢。

data.frame:

    b<–structure(list(id = structure(c(1L, 1L, 2L), .Label = c("1-191", 
    "1-192", "1-131"), class = "factor"), participants = c("Takfir wa'l Hijra,AIS,AIS, GIA,AIS, GIA,AIS, GIA,AIS, GIA,AIS, GIA,GIA,AQIM, GIA,AQIM, GIA,AQIM, GIA,AQIM, GIA,AQIM, GIA,AQIM,AQIM,AQIM,AQIM,AQIM,AQIM,AQIM,AQIM,AQIM, MUJAO,AQIM", 
    "Takfir wa'l Hijra,AIS,AIS, GIA,AIS, GIA,AIS, GIA,AIS, GIA,AIS, GIA,GIA,AQIM, GIA,AQIM, GIA,AQIM, GIA,AQIM, GIA,AQIM, GIA,AQIM,AQIM,AQIM,AQIM,AQIM,AQIM,AQIM,AQIM,AQIM, MUJAO,AQIM", 
    "FLEC-R,FLEC-FAC, FLEC-R,FLEC-FAC,FLEC-FAC, FLEC-R,FLEC-FAC,FLEC-FAC, FLEC-R,FLEC-FAC,FLEC-FAC,FLEC-FAC"
    ), s = list(c("Takfir wa'l Hijra", "AIS", "AIS", " GIA", "AIS", 
    " GIA", "AIS", " GIA", "AIS", " GIA", "AIS", " GIA", "GIA", "AQIM", 
    " GIA", "AQIM", " GIA", "AQIM", " GIA", "AQIM", " GIA", "AQIM", 
    " GIA", "AQIM", "AQIM", "AQIM", "AQIM", "AQIM", "AQIM", "AQIM", 
    "AQIM", "AQIM", " MUJAO", "AQIM"), c("Takfir wa'l Hijra", "AIS", 
    "AIS", " GIA", "AIS", " GIA", "AIS", " GIA", "AIS", " GIA", "AIS", 
    " GIA", "GIA", "AQIM", " GIA", "AQIM", " GIA", "AQIM", " GIA", 
    "AQIM", " GIA", "AQIM", " GIA", "AQIM", "AQIM", "AQIM", "AQIM", 
    "AQIM", "AQIM", "AQIM", "AQIM", "AQIM", " MUJAO", "AQIM"), c("FLEC-R", 
    "FLEC-FAC", " FLEC-R", "FLEC-FAC", "FLEC-FAC", " FLEC-R", "FLEC-FAC", 
    "FLEC-FAC", " FLEC-R", "FLEC-FAC", "FLEC-FAC", "FLEC-FAC"))), .Names = c("id", 
    "participants", "s"), row.names = c(1L, 2L, 24L), class = "data.frame")

2 个答案:

答案 0 :(得分:3)

使用ddply可以执行此操作

library(plyr)
ddply(b,~id,summarise,
      nn= paste(unique(unlist(strsplit(participants,','))),collapse=','))

   id                                         nn
1 1-191 Takfir wa'l Hijra,AIS, GIA,GIA,AQIM, MUJAO
2 1-192                    FLEC-R,FLEC-FAC, FLEC-R

答案 1 :(得分:2)

within对此有好处。它允许重新分配表达式中的变量。此外,您可以在strsplit中调整正则表达式,以便一次性删除这些空格和逗号。

> within(b[-3],{
      unique.participants <- sapply(strsplit(participants, "(,)|(, )"), unique)
      rm(participants)
  })
#       id                      unique.participants
# 1  1-191 Takfir wa'l Hijra, AIS, GIA, AQIM, MUJAO
# 2  1-191 Takfir wa'l Hijra, AIS, GIA, AQIM, MUJAO
# 24 1-192                         FLEC-R, FLEC-FAC

因为我看到了

  

我想仅针对每个ID(会话号)执行这些步骤,这也可能是重复的。

在你的问题中,我坚持使用重复的行。