목록 열이있는 티블이 있습니다. 이 목록 열의 각 요소는 두 목록의 목록으로 구성된 명명 된 키-값 쌍의 집합입니다. 키는 'CUSTOM_FIELD_ID'라고하며 값은 'FIELD_VALUE'에 저장됩니다.
각 행의 쌍 수와 쌍의 순서는 티블에서 다릅니다. 특정 키 ( 'CONTACT_FIELD_7')와 값 ( 'XYZ') 쌍을 사용하여 tibble에서 행을 검색하고 싶습니다.
내 생각은 어떻게 든 목록 열을 완전히 중첩 해제하고 테이블에 추가 행을 추가하여 각 키-값 쌍이 자체 행을 갖도록하는 것입니다. 그런 다음 티블에 두 개의 문자 열을 추가하십시오. 하나는 키용이고 다른 하나는 값용입니다. 그러나 여전히 두 개의 목록이있는 목록 열이 남아 있습니다 (이제 각각에 단일 요소 만 있음).
또한 목록 목록에서 문자열을 검색하는 방법을 찾으려고했습니다.
이것은 입력입니다.
library(tidyverse)
df_in <- tibble(CONTACT_ID = c(255381470, 255395936, 255400708, 255952013),
CUSTOMFIELDS = list(list(list('CUSTOM_FIELD_ID' = 'CONTACT_FIELD_7',
'FIELD_VALUE' = 'XYZ'),
list('CUSTOM_FIELD_ID' = 'CONTACT_FIELD_1',
'FIELD_VALUE' = '123')),
list(list('CUSTOM_FIELD_ID' = 'CONTACT_FIELD_2',
'FIELD_VALUE' = 'abc')),
list(list('CUSTOM_FIELD_ID' = 'CONTACT_FIELD_2',
'FIELD_VALUE' = 'def'),
list('CUSTOM_FIELD_ID' = 'CONTACT_FIELD_3',
'FIELD_VALUE' = '1234'),
list('CUSTOM_FIELD_ID' = 'CONTACT_FIELD_7',
'FIELD_VALUE' = 'XYZ')),
list(list('CUSTOM_FIELD_ID' = 'CONTACT_FIELD_1',
'FIELD_VALUE' = '456'),
list('CUSTOM_FIELD_ID' = 'CONTACT_FIELD_7',
'FIELD_VALUE' = 'ZYX'),
list('CUSTOM_FIELD_ID' = 'CONTACT_FIELD_5',
'FIELD_VALUE' = 'def'))))
# A tibble: 4 x 2
CONTACT_ID CUSTOMFIELDS
<dbl> <list>
1 255381470 <list [2]>
2 255395936 <list [1]>
3 255400708 <list [3]>
4 255952013 <list [3]>
현재 제가 생각하는 중간 산출물은
df_out_long <- tibble(CONTACT_ID = c(rep(255381470, 2), 255395936, rep(255400708, 3), rep(255952013, 3)),
CUSTOM_FIELD_ID = c('CONTACT_FIELD_7', 'CONTACT_FIELD_1', 'CONTACT_FIELD_2',
'CONTACT_FIELD_2', 'CONTACT_FIELD_3', 'CONTACT_FIELD_7',
'CONTACT_FIELD_1', 'CONTACT_FIELD_7', 'CONTACT_FIELD_5'),
FIELD_VALUE = c('XYZ', '123', 'abc', 'def', '1234', 'XYZ', '456', 'ZYX', 'def'))
# A tibble: 9 x 3
CONTACT_ID CUSTOM_FIELD_ID FIELD_VALUE
<dbl> <chr> <chr>
1 255381470 CONTACT_FIELD_7 XYZ
2 255381470 CONTACT_FIELD_1 123
3 255395936 CONTACT_FIELD_2 abc
4 255400708 CONTACT_FIELD_2 def
5 255400708 CONTACT_FIELD_3 1234
6 255400708 CONTACT_FIELD_7 XYZ
7 255952013 CONTACT_FIELD_1 456
8 255952013 CONTACT_FIELD_7 ZYX
9 255952013 CONTACT_FIELD_5 def
그런 다음 쉽게 필터링하여 원하는 최종 결과를 얻을 수 있습니다.
df_out_long %>%
filter(CUSTOM_FIELD_ID == 'CONTACT_FIELD_7', FIELD_VALUE == 'XYZ')
CONTACT_ID CUSTOM_FIELD_ID FIELD_VALUE
<dbl> <chr> <chr>
1 255381470 CONTACT_FIELD_7 XYZ
2 255400708 CONTACT_FIELD_7 XYZ
이 작업을 수행하는 훨씬 더 효율적인 방법이있을 수 있으므로 위의 'df_out_long'은 전혀 필요하지 않을 수 있습니다. 그러나이 경로를 따라 목록의 가장 깊은 수준의 중첩을 해제 할 수 있습니다. 그러면 별도의 행에 각 키-값 쌍을 수용하기 위해 tibble에 추가 행이 생성됩니다. 결과적으로 길이 2의 목록이있는 목록 열을 제거 할 수 없으며 어떻게 든 'CUSTOM_FIELD_ID'및 'FIELD_VALUE'라는 이름의 두 문자 열로 병합합니다.
df_in %>%
mutate_if(is.list, simplify_all) %>%
unnest()
# A tibble: 9 x 2
CONTACT_ID CUSTOMFIELDS
<dbl> <list>
1 255381470 <list [2]>
2 255381470 <list [2]>
3 255395936 <list [2]>
4 255400708 <list [2]>
5 255400708 <list [2]>
6 255400708 <list [2]>
7 255952013 <list [2]>
8 255952013 <list [2]>
9 255952013 <list [2]>
한 가지 방법은 purrr::keep
목록 자체를 관심있는 요소로만 필터링하는 데 사용 하는 것입니다. 그런 다음 unnest
남은 항목이있는 행으로 필터링 한 다음 티 블로 전환하여 깔끔하게 중첩 해제 할 수 있습니다.
library(tidyverse)
df_discarded <- df_in %>% mutate(CUSTOMFIELDS = map(
CUSTOMFIELDS, keep,
~.x$CUSTOM_FIELD_ID == 'CONTACT_FIELD_7' && .x$FIELD_VALUE == 'XYZ'
))
df_discarded
#> # A tibble: 4 x 2
#> CONTACT_ID CUSTOMFIELDS
#> <dbl> <list>
#> 1 255381470 <list [1]>
#> 2 255395936 <list [0]>
#> 3 255400708 <list [1]>
#> 4 255952013 <list [0]>
df_filtered <- df_discarded %>% unnest()
df_filtered
#> # A tibble: 2 x 2
#> CONTACT_ID CUSTOMFIELDS
#> <dbl> <list>
#> 1 255381470 <list [2]>
#> 2 255400708 <list [2]>
df_out <- df_filtered %>%
mutate(CUSTOMFIELDS = map(CUSTOMFIELDS, as_tibble)) %>%
unnest()
df_out
#> # A tibble: 2 x 3
#> CONTACT_ID CUSTOM_FIELD_ID FIELD_VALUE
#> <dbl> <chr> <chr>
#> 1 255381470 CONTACT_FIELD_7 XYZ
#> 2 255400708 CONTACT_FIELD_7 XYZ
또는 모든 것을 가져 와서 filter
마지막에 사용하려면 bind_rows
명명 된 목록을 tibbles로 전환 한 다음 중첩을 해제 할 수 있습니다.
df_in %>%
mutate(CUSTOMFIELDS = map(CUSTOMFIELDS, bind_rows)) %>%
unnest()
#> # A tibble: 9 x 3
#> CONTACT_ID CUSTOM_FIELD_ID FIELD_VALUE
#> <dbl> <chr> <chr>
#> 1 255381470 CONTACT_FIELD_7 XYZ
#> 2 255381470 CONTACT_FIELD_1 123
#> 3 255395936 CONTACT_FIELD_2 abc
#> 4 255400708 CONTACT_FIELD_2 def
#> 5 255400708 CONTACT_FIELD_3 1234
#> 6 255400708 CONTACT_FIELD_7 XYZ
#> 7 255952013 CONTACT_FIELD_1 456
#> 8 255952013 CONTACT_FIELD_7 ZYX
#> 9 255952013 CONTACT_FIELD_5 def
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다