source

목록에서 NULL 요소 제거

manycodes 2023. 7. 5. 20:51
반응형

목록에서 NULL 요소 제거

mylist <- list(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    123, NULL, 456)

> mylist
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL

[[6]]
NULL

[[7]]
NULL

[[8]]
NULL

[[9]]
NULL

[[10]]
NULL

[[11]]
[1] 123

[[12]]
NULL

[[13]]
[1] 456

내 목록에는 13개의 요소가 있으며, 그 중 11개는 NULL입니다.제거하고 싶지만 비어 있지 않은 요소의 인덱스는 유지합니다.

mylist2 = mylist[-which(sapply(mylist, is.null))]
> mylist2
[[1]]
[1] 123

[[2]]
[1] 456

이렇게 하면 NULL 요소는 제거되지만 비어 있지 않은 요소는 다시 인덱싱하지 않습니다. 즉, 원하는 경우mylist2비어 있지 않은 항목의 인덱스가 보존되는 이와 같은 모양입니다.

> mylist2
[[11]]
[1] 123

[[13]]
[1] 456

가장 가까운 방법은 목록 요소의 이름을 먼저 지정한 다음 NULL을 제거하는 것입니다.

names(x) <- seq_along(x)

## Using some higher-order convenience functions
Filter(Negate(is.null), x)
# $`11`
# [1] 123
# 
# $`13`
# [1] 456

# Or, using a slightly more standard R idiom
x[sapply(x, is.null)] <- NULL
x
# $`11`
# [1] 123
# 
# $`13`
# [1] 456

간단히 사용mylist[lengths(mylist) != 0].

기능.lengths()R 3.2.0(2015년 4월)에 도입되었습니다.

Tidyverse에 포함된 이 패키지는 목록 작업을 위한 우아하고 빠른 기능을 갖추고 있습니다.

require(tidyverse)

# this works
compact(mylist)

# or this
mylist %>% discard(is.null)

# or this
# pipe "my_list" data object into function "keep()", make lambda function inside "keep()" to return TRUE FALSE.
mylist %>% keep( ~ !is.null(.) )

위의 모든 옵션은 Purr에서 제공됩니다.출력:

[[1]] 
[1] 123

[[2]] 
[1] 456

참고: compact()는 플라이어에 있었지만 dplyr이 플라이어를 대체했으며 compact()는 주변에 있었지만 purrr로 이동했습니다.어쨌든, 모든 기능은 부모 패키지에 있습니다.



다음은 Purr 치트 시트 다운로드 링크입니다.

https://rstudio.com/resources/cheatsheets/

또는 브라우저에서 Purr cheatsheet를 직접 보려면 다음을 수행합니다.

https://evoldyn.gitlab.io/evomics-2018/ref-sheets/R_purrr.pdf

목록의 모든 null 항목을 자동으로 제거하는 기능이 있으며, 목록의 이름이 지정되면 null이 아닌 항목의 이름을 유지합니다.

이 기능을 다음과 같이 부릅니다.compact포장에서plyr.

l <- list( NULL, NULL, foo, bar)
names(l) <- c( "one", "two", "three", "four" )

plyr::compact(l)

null이 아닌 항목의 인덱스를 보존하려면 이전 게시물에서 수행한 대로 목록 이름을 지정한 다음 목록을 압축할 수 있습니다.

names(l) <- seq_along(l)
plyr::compact(l)

이름을 유지하려면 할 수 있습니다.

a <- list(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
          123, NULL, 456)
non_null_names <- which(!sapply(a, is.null))
a <- a[non_null_names]
names(a) <- non_null_names
a

그런 다음 요소에 액세스할 수 있습니다.

a[['11']]
num <- 11
a[[as.character(num)]]
a[[as.character(11)]]
a$`11`

당신은 그것들을 깔끔하게 할 수 없습니다.[[11]],[[13]]하지만, 그것들은 숫자 인덱스를 나타내기 때문에 표기법.

이 솔루션은 중첩된 목록에서도 작동합니다.

rlist::list.clean(myNestedlist ,recursive = T)

여기 편리한 체인 표기법이 있습니다.

library(magrittr)

mylist %>%
  setNames(seq_along(.)) %>%
  Filter(. %>% is.null %>% `!`, .)

다음은 기본 R 함수만 사용하여 매우 간단한 방법입니다.

names(mylist) <- 1:length(mylist)
mylist2 <- mylist[which(!sapply(mylist, is.null))]

언급URL : https://stackoverflow.com/questions/33004238/removing-null-elements-from-a-list

반응형