2014-07-11 4 views
0

많은 참여자의 이름을 포함하는 변수가있는 data.frame이 있습니다. 참가자의 이름은 모두 하나의 (= 1) 긴 문자열로 쉼표로 구분 된 이름으로 포함됩니다. 일부 이름은 반복적입니다. 나는 한 번만 각 이름을 얻으려고 노력한다.데이터 프레임의 중첩 목록에서 고유 요소 추출

아래 데이터입니다.

나는 목록에 이름의 긴 문자열을 변환 : 다음을 표준화하는 이름의 양쪽에 공간을 제거

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

.

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

그러나,이 목록은 모든 고유 한 이름을 포함 :이 목록에서

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

나는 고유 값

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

결과 모두 고유 한 이름을했다. 각 ID (세션 번호)에 대해서만이 단계를 수행하고 싶습니다. 반복적 일 수 있습니다.

위의 작업을 ddply로 수행하려고 시도했지만 아무 소용이 없습니다. 어떤 추천? 불행히도, 나는리스트를 다루는 것에 대해서는별로 익숙하지 않다.

결국, dataframe은 다음과 같아야합니다

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") 
+0

당신은'list'로 결과를 원하는 않았거나 그들이 '다시 함께 paste'd 싶지 않았다 할 수 ddply 사용하십니까? – A5C1D2H2I1M1N2O1R2T1

답변

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 (세션 수), 이러한 단계를 수행하려는 때문에.

귀하의 질문에, 나는 중복 행을 고수하고 있습니다.

+0

많은 감사합니다! 이것은 제가 찾고있는 것에 매우 가깝습니다. unique.participants는 이제 목록입니다. 이 목록을 ID 당 모든 고유 참여자를 결합한 하나의 긴 문자열로 다시 변환하려면 어떻게해야합니까? (이 문자열은 나중에 일부 그래프 주석에 붙여 넣음). 따라서 data.frame에 c ("AIS", "GIA", "AQIM", "MUJAO")를 쓰는 대신 단순히 "AIS, GIA, AQIM, MUJAO"를 문자열로 사용하고 싶습니다. 또 하나의 질문 : [-3] - 왜 실제로 "마이너스"입니까? – zoowalker

+1

@zoowalk,'sapply'에 대한 함수로, 거기에'paste '를 추가합니다 (agstudy가 그의 대답에서했던 것처럼). '[-3]'은 공유 한 샘플 데이터의 세 번째 열을 삭제하는 것입니다 (이 질문의 문맥에서는 불필요합니다). – A5C1D2H2I1M1N2O1R2T1

3

이이

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 
+0

OP가 두 번째 행을 제거하려고하는지 잘 모르겠습니다. 나는 이것을 "결국 데이터 프레임은 이렇게 보일 것입니다"라고 말합니다. –

관련 문제