【问题标题】:extracting unique elements from nested list in dataframe从数据框中的嵌套列表中提取唯一元素
【发布时间】:2014-07-11 14:40:30
【问题描述】:

我有一个带有变量的 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")

【问题讨论】:

  • 您是希望将结果作为list 还是希望将它们重新组合为pasted?

标签: r string list plyr


【解决方案1】:

使用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

【讨论】:

  • 我不确定 OP 是否希望删除第二行。我基于“最终数据框应该看起来像这样”
【解决方案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(会话号)执行这些步骤,这也可以重复。

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

【讨论】:

  • 非常感谢!这与我一直在寻找的非常接近。 unique.participants 现在是一个列表。如何将此列表再次转换为一个长字符串,将每个 ID 的所有唯一参与者组合在一起。 (此字符串稍后将粘贴到某些图形注释中)。因此,我不想在 data.frame 中包含 c("AIS", "GIA", "AQIM", "MUJAO"),而只是希望将 "AIS, GIA, AQIM, MUJAO" 作为字符串。还有一个问题:[-3] - 为什么实际上是“减号”?
  • @zoowalk,对于sapply 的函数,也可以在其中添加paste(就像agstudy 在他的回答中所做的那样)。 [-3] 是从您共享的示例数据中删除第三列(因为在此问题的上下文中没有必要)。
【解决方案3】:

使用data.table,这应该是获得所需内容的更简单方法。

library(data.table)
b = data.table(b)[, unique_s := mapply(s, FUN = function(x) { unique(gsub(" ","",unlist(x))) } )]

#-- Output --#
b$unique_s
[[1]]
[1] "Takfirwa'lHijra" "AIS"             "GIA"             "AQIM"            
"MUJAO"          

[[2]]
[1] "Takfirwa'lHijra" "AIS"             "GIA"             "AQIM"            
"MUJAO"          

[[3]]
[1] "FLEC-R"   "FLEC-FAC"

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    相关资源
    最近更新 更多