목록에서 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
'source' 카테고리의 다른 글
fatal: git-write-tree: 트리 작성 오류 (0) | 2023.07.10 |
---|---|
GitHub에서 다른 사람의 코드에 기여하려면 어떻게 해야 합니까? (0) | 2023.07.05 |
ADO.NET 제공업체 '오라클'.관리 데이터 액세스.Client'가 컴퓨터 또는 애플리케이션 구성 파일에 등록되어 있지 않거나 로드할 수 없습니다. (0) | 2023.07.05 |
추적되지 않은 파일만 추가 (0) | 2023.07.05 |
기본 키를 커버링 인덱스에 포함해야 합니까? (0) | 2023.07.05 |