차원이 다른 목록 목록 인 목록 열을 사용하여 tibble에서 단일 요소를 추출하는 방법은 무엇입니까?

Thijs

목록 열이있는 티블이 있습니다. 이 목록 열의 각 요소는 두 목록의 목록으로 구성된 명명 된 키-값 쌍의 집합입니다. 키는 '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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    어떻게 아무리 "나쁜", ANY의 SSL 인증서와 HttpClient를 사용하지합니다

  2. 2

    SAP Java Connector (SAP JCO) SAP Funcion Module의 동적 매개 변수 및 값 목록

  3. 3

    자바, 레디 스, 탄성 검색, 몽고와 자동 완성

  4. 4

    ElasticSearch-노드 잠금을 가져 오지 못했습니다.

  5. 5

    Excel : 합계가 N보다 크거나 같은 상위 값 찾기

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    Ubuntu는 GUI에서 암호로 사용자를 만듭니다.

  8. 8

    R-이중 항목 피벗 테이블 만들기

  9. 9

    PyCharm에서 갑자기 일부 메뉴 명령이 작동을 멈췄습니다.

  10. 10

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  11. 11

    자바의 .txt 파일에서 2D 배열 읽기

  12. 12

    매개 변수에서 쿼리 객체를 선언하는 방법은 무엇입니까?

  13. 13

    cypress로 배열의 인덱스를 가져 오면 대신 "-1"이 반환됩니다.

  14. 14

    VBA-조건에 따라 자동으로 팝업되는 오류 메시지를 가질 수 있습니까?

  15. 15

    여러 양식을 사용하여 목록 상자 내에서 데이터 편집 문제

  16. 16

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  17. 17

    스크립트에 의해 SSH를 통해 자동으로 X 프로세스 전달

  18. 18

    그룹 별 중복 관측치를 축소하면서 테이블 전치

  19. 19

    마우스 휠 JQuery 이벤트 핸들러에 대한 방향 가져 오기

  20. 20

    버튼을 클릭하기 위해 pywinauto를 가져올 수 없습니다.

  21. 21

    randomUUID ()를 사용하여 생성 된 UUID의 길이를 줄이는 방법

뜨겁다태그

보관