편집 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"
))
데이터 집합의 처음 몇 행을 말하거나 데이터를 나타내는 샘플 데이터 집합을 만들 수 있습니까? – A5C1D2H2I1M1N2O1R2T1
내 데이터 집합의 첫 번째 두 번째 항목에 대해 dput을 추가하는 게시물을 편집했습니다. – Tau
do.call (bind_rows, out)가 도움이됩니까? 귀하의 데이터는 이해하기가 매우 어렵습니다. – Bastien