2017-12-18 21 views
0

편집 1 : 더 간단한 용어의 문제 (전체 문제에 대한, 원본 편집 확인) 내가 키, 값 목록을 목록에서 제외 할 수 있습니까Unnest 목록

데이터 프레임 내에서 쌍을 찾을 수 있습니다. 예를 들어

:

_source.types     _source.label 
1 key1, key2, value1, value2  label1 
2 NULL       label1 
3 key3, value3     label2 

(키 1, 키 2, 값 1, 값)는 <data.frame>

예상 결과하는 것으로 : 나는 unlist, unnest 시도했습니다

types.k1 types.v1 types.k2 types.v2 label 
1 key1  value1 key2  value2 label1 
2 NULL  NULL  NULL  NULL  label1 
3 key3  value3 NULL  NULL  label2 

, ... 요소의 수 또는 객체의 클래스로 인해 항상 오류가 있기 때문에 성공하지 못했습니다.

원본 수정 신축성있는 패키지를 사용하여 신축성있는 검색 기반에 대한 검색 요청의 결과가 있습니다. 쿼리는 기존 데이터 프레임 내의 용어에서 나오는 루프이므로 각 용어에 대한 응답 목록이 있습니다.

[[1]] 
_index _type  _id _score        _source.types 
1 index_1 triplet Q9327 13.18037 Q5, dbPedia.Person, être humain, personne 
2 index_1 triplet Q3122270 13.17847   Q11424, dbPedia.Film, film, film 
                         _source.subTypes  _source.label _source.id 
1 Q1930187, Q36180, Q15949613, Q6625963, Q214917, journaliste, écrivain, nouvelliste, romancier, dramaturge Guy de Maupassant  Q9327 
2                          NULL Guy de Maupassant Q3122270 

을 당신이 볼 수 있듯이, 내가 첫 번째 항 2 개 가능한 결과를 얻을 :

#existing dataframe 
df <- data.frame(id=c("1","2"),terms=(c("Guy de Maupassant","Vincent Cassel"))) 

#loop query to ES 
query_es <- '{"_source": ["id", "label", "types", "subTypes"], 
"query":{"bool":{"must":[{"term":{"label":"%s"}}]}}}' 

out = list() 
for (i in seq_along(df$terms)) { 
    out[[i]] <- Search(index = "index_1", 
        body = sprintf(query_es, df$terms[i]), 
        size = 3, asdf=TRUE)$hits$hits 
} 

결과는 다음과 같은 목록의 목록 (난 그냥 선명도에 대한 첫 번째 결과를 표시) 인은 라이터 또는 영화로 구성되며 각각은 유형 및 하위 유형에 대한 {id, value} 목록이 있습니다. 더 포괄적 인 뷰를 위해, I는 출력 정렬 다시 :

out2 <- bind_rows(out, .id = "id") 
out2 <- out_i_bind2[,-c(2:5)] 
colnames(out2) <- c("id","types","subTypes","entityLabel","entityId") 

결과를, I는 (첫 번째 항에 대해서만) 가지고

id          types 
1 1 Q5, dbPedia.Person, être humain, personne 
2 1   Q11424, dbPedia.Film, film, film 
                           subTypes  entityLabel entityId 
1 Q1930187, Q36180, Q15949613, Q6625963, Q214917, journaliste, écrivain, nouvelliste, romancier, dramaturge Guy de Maupassant Q9327 
2                          NULL Guy de Maupassant Q3122270 

공지 그 초 result (movie), 나는 어떤 subType도 가지고 있지 않다. 또한, 유형 또는 부속 유형 내의 나열된 요소의 길이는 검색 용어에 따라 다를 수 있습니다.

이제 데이터 프레임을 갖기 위해 목록을 제외 시키겠습니다 (미안하지만 형식이 매우 포괄적이지는 않지만 기본적으로 각 {key, value}이 (가) 2 열에 중첩되지 않도록하는 것이 좋습니다. 증분 색인) :

X_id X_source.types.id X_source.types.value X_source.types.id.1 X_source.types.value.1 X_source.subTypes.id 
1 1    Q5   être humain  dbPedia.Person    personne    Q1930187 
2 1   Q11424     film  dbPedia.Film     film     <NA> 
    X_source.subTypes.value X_source.subTypes.id.1 X_source.subTypes.value.1 X_source.subTypes.id.2 X_source.subTypes.value.2 
1    journaliste     Q36180     écrivain    Q15949613    nouvelliste 
2     <NA>     <NA>      <NA>     <NA>      <NA> 
    X_source.subTypes.id.3 X_source.subTypes.value.3 X_source.subTypes.id.4 X_source.subTypes.value.4 X_source.label X_source.id 
1    Q6625963     romancier    Q214917    dramaturge Guy de Maupassant  Q9327 
2     <NA>      <NA>     <NA>      <NA> Guy de Maupassant Q3122270 

관련 ID의 보존은 매우 중요합니다. Convert in R output of package Elastic (nested list?) to data.frame or JSON 또는 여기에 : 어떤 성공없이 Extract data from elasticsearch into R with elastic package, load into a data frame, error due to hits not expanding to the same length ...

그것을 다루는 어떤 생각 나는 여기 많은 것들을 시도? 다시 정렬 된 출력 (out2)을 변환해야하는지 또는 원본 출력 (out)으로 되돌아 오는 것이 더 좋은지 궁금합니다.

미리 감사드립니다!

PS :

> dput(out, control="useSource") 
list(list(`_index` = c("alias_fr", "alias_fr"), `_type` = c("triplet", 
"triplet"), `_id` = c("Q9327", "Q3122270"), `_score` = c(13.180366, 
13.178474), `_source.types` = list(list(id = c("Q5", "dbPedia.Person" 
), value = c("être humain", "personne")), list(id = c("Q11424", 
"dbPedia.Film"), value = c("film", "film"))), `_source.subTypes` = list(
    list(id = c("Q1930187", "Q36180", "Q15949613", "Q6625963", 
    "Q214917"), value = c("journaliste", "écrivain", "nouvelliste", 
    "romancier", "dramaturge")), NULL), `_source.label` = c("Guy de Maupassant", 
"Guy de Maupassant"), `_source.id` = c("Q9327", "Q3122270")), 
    list(`_index` = "alias_fr", `_type` = "triplet", `_id` = "Q193504", 
     `_score` = 13.18018, `_source.types` = list(list(id = c("Q5", 
     "dbPedia.Person"), value = c("être humain", "personne" 
     ))), `_source.subTypes` = list(list(id = c("Q33999", 
     "Q10800557", "Q3282637", "Q2526255", "Q28389"), value = c("acteur", 
     "acteur de cinéma", "producteur de cinéma", "réalisateur", 
     "scénariste"))), `_source.label` = "Vincent Cassel", 
     `_source.id` = "Q193504")) 

그리고 OUT2에 대해 동일합니다 : 여기에 dput의 (DF 검색에서)은 "밖으로"의 버전이 드디어 문제를 해결하기 위해 관리

> dput(out2, control="useSource") 
list(id = c("1", "1", "2"), types = list(list(id = c("Q5", "dbPedia.Person" 
), value = c("être humain", "personne")), list(id = c("Q11424", 
"dbPedia.Film"), value = c("film", "film")), list(id = c("Q5", 
"dbPedia.Person"), value = c("être humain", "personne"))), subTypes = list(
    list(id = c("Q1930187", "Q36180", "Q15949613", "Q6625963", 
    "Q214917"), value = c("journaliste", "écrivain", "nouvelliste", 
    "romancier", "dramaturge")), NULL, list(id = c("Q33999", 
    "Q10800557", "Q3282637", "Q2526255", "Q28389"), value = c("acteur", 
    "acteur de cinéma", "producteur de cinéma", "réalisateur", 
    "scénariste"))), entityLabel = c("Guy de Maupassant", "Guy de Maupassant", 
"Vincent Cassel"), entityId = c("Q9327", "Q3122270", "Q193504" 
)) 
+0

데이터 집합의 처음 몇 행을 말하거나 데이터를 나타내는 샘플 데이터 집합을 만들 수 있습니까? – A5C1D2H2I1M1N2O1R2T1

+0

내 데이터 집합의 첫 번째 두 번째 항목에 대해 dput을 추가하는 게시물을 편집했습니다. – Tau

+0

do.call (bind_rows, out)가 도움이됩니까? 귀하의 데이터는 이해하기가 매우 어렵습니다. – Bastien

답변

0

는, this post 및 일부 변형 단계 덕분입니다. 이 솔루션은 비록 매우 우아 아니지만, 그것은 작동합니다

out_bind <- bind_rows(out, .id = "id") 

#transform to data table in order to apply rbindlist 
out <- as.data.table(out_bind) 
#rbindlist for "types" variable 
out_nest1 <- rbindlist(out$types, fill = T, id = "row")[, entityId := out$entityId[row]][] 
#rbindlist to "subTypes variable (choosing another id name -row1-, if not Rstudio was crashing!) 
out_nest2 <- rbindlist(out$subTypes, fill = T, id = "row1")[, entityId := out$entityId[row1]][] 

#finally joining the whole data 
out <- full_join(out,out_nest1,by="entityId") 
out <- full_join(out,out_nest2,by="entityId") 

가 지금은 좋은 크리스마스를 보낼 수)

편집 : 충돌이 ID 이름 때문에 아니었지만, 데이터에 테이블 문제, 해결 된 here.