Programing

목록에서 요소를 제거하려면 어떻게해야합니까?

lottogame 2020. 4. 8. 07:34
반응형

목록에서 요소를 제거하려면 어떻게해야합니까?


목록이 있고 단일 요소를 제거하고 싶습니다. 어떻게해야합니까?

이 기능의 명백한 이름이 참조 매뉴얼에 있다고 생각하는 것을 찾으려고 노력했지만 적절한 것을 찾지 못했습니다.


나는 R을 전혀 모른다. 그러나 약간의 창의적인 인터넷 검색으로 나를 이끌었다. http://tolstoy.newcastle.edu.au/R/help/05/04/1919.html

거기에서 핵심 인용문 :

목록에서 요소를 제거하는 방법에 대한 R에 대한 명시 적 문서를 찾지 못했지만 시행 착오가 나에게 알려줍니다.

myList [[5]] <-NULL

다섯 번째 요소를 제거한 다음 해당 요소를 삭제하여 발생한 구멍을 "닫습니다". 인덱스 값을 플러싱하므로 요소를 떨어 뜨릴 때주의해야합니다. 나는 목록의 뒤에서 앞으로 일해야한다.

나중에 스레드에서 해당 게시물에 대한 응답 상태 :

목록의 요소를 삭제하려면 R FAQ 7.1을 참조하십시오.

R FAQ관련 섹션은 다음과 같이 말합니다.

... x [i] 또는 x [[i]]를 NULL로 설정하지 마십시오. 목록에서 해당 구성 요소가 제거되기 때문입니다.

어느 요소를 제거하는 방법을 (뒤로 약간) 설명하는 것 같습니다.

그것이 올바른 방향으로 도움이되거나 적어도 당신을 이끌 길 바랍니다.


목록을 제자리에서 수정하지 않으려면 (예 : 요소가 제거 된 목록을 함수에 전달하기 위해) 인덱싱을 사용할 수 있습니다. 음수 인덱스는 "이 요소를 포함하지 않음"을 의미합니다.

x <- list("a", "b", "c", "d", "e"); # example list

x[-2];       # without 2nd element

x[-c(2, 3)]; # without 2nd and 3rd

또한 논리 인덱스 벡터가 유용합니다.

x[x != "b"]; # without elements that are "b"

이것은 데이터 프레임에서도 작동합니다.

df <- data.frame(number = 1:5, name = letters[1:5])

df[df$name != "b", ];     # rows without "b"

df[df$number %% 2 == 1, ] # rows with odd numbers only

다음은 R 에서 목록 의 마지막 요소를 제거하는 방법입니다 .

x <- list("a", "b", "c", "d", "e")
x[length(x)] <- NULL

x가 벡터 일 경우 새 객체를 만들어야합니다.

x <- c("a", "b", "c", "d", "e")
x <- x[-length(x)]
  • 목록벡터 작업

한 줄로 된 목록에서 Null 요소 제거

x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]

건배


명명 된 목록이 있고 특정 요소를 제거하려면 다음을 시도하십시오.

lst <- list(a = 1:4, b = 4:8, c = 8:10)

if("b" %in% names(lst)) lst <- lst[ - which(names(lst) == "b")]

이 목록을 만들 것입니다 lst요소 a, b, c. 두 번째 줄은 요소 b가 존재하는지 확인한 후 언급합니다 (@hjv 언급 된 문제를 피하기 위해).

또는 더 나은 :

lst$b <- NULL

이 방법은 (예를 들어, 존재하지 않는 요소를 삭제하려고 문제가되지 않습니다 lst$g <- NULL)


명명 된 목록 인 경우 간단히 사용할 수 있다고 덧붙이고 싶습니다 within.

l <- list(a = 1, b = 2)    
> within(l, rm(a))
$b
[1] 2

따라서 원래 목록을 덮어 쓸 수 있습니다

l <- within(l, rm(a)) 

alist에서 이름이 지정된 요소를 제거 합니다 l.


다양한 종류의 목록 작업을 처리하기 위한 rlist 패키지 ( http://cran.r-project.org/web/packages/rlist/index.html )가 있습니다.

예 ( http://cran.r-project.org/web/packages/rlist/vignettes/Filtering.html ) :

library(rlist)
devs <- 
  list(
    p1=list(name="Ken",age=24,
      interest=c("reading","music","movies"),
      lang=list(r=2,csharp=4,python=3)),
    p2=list(name="James",age=25,
      interest=c("sports","music"),
      lang=list(r=3,java=2,cpp=5)),
    p3=list(name="Penny",age=24,
      interest=c("movies","reading"),
      lang=list(r=1,cpp=4,python=2)))

list.remove(devs, c("p1","p2"))

결과 :

# $p3
# $p3$name
# [1] "Penny"
# 
# $p3$age
# [1] 24
# 
# $p3$interest
# [1] "movies"  "reading"
# 
# $p3$lang
# $p3$lang$r
# [1] 1
# 
# $p3$lang$cpp
# [1] 4
# 
# $p3$lang$python
# [1] 2

아직 답변이 필요한지 모르겠지만 R에 대한 제한된 (3 주 분량의 자체 교육 R) 경험에서 NULL할당을 사용하는 것이 실제로 잘못되거나 차선 책임을 발견했습니다. 특히 동적으로 업데이트하는 경우 for-loop와 같은 목록.

보다 정확하게

myList[[5]] <- NULL

오류가 발생합니다

myList [[5]] <-NULL : 교체의 길이는 0입니다

또는

교체 할 것보다 많은 요소가 제공됨

내가 더 일관되게 일한 것은

myList <- myList[[-5]]

-요소의 위치와 함께 (음수)를 사용하십시오 . 예를 들어 세 번째 요소를 제거 해야하는 경우your_list[-3]

입력

my_list <- list(a = 3, b = 3, c = 4, d = "Hello", e = NA)
my_list
# $`a`
# [1] 3

# $b
# [1] 3

# $c
# [1] 4

# $d
# [1] "Hello"

# $e
# [1] NA

목록에서 단일 요소 제거

 my_list[-3]
 # $`a`
 # [1] 3

 # $b
 # [1] 3

 # $d
 # [1] "Hello"

 # $e
 [1] NA

목록에서 여러 요소 제거

 my_list[c(-1,-3,-2)]
 # $`d`
 # [1] "Hello"

 # $e
 # [1] NA

 my_list[c(-3:-5)]
 # $`a`
 # [1] 3

 # $b
 # [1] 3

 my_list[-seq(1:2)]
 # $`c`
 # [1] 4

 # $d
 # [1] "Hello"

 # $e
 # [1] NA

명명 된 목록에 대해 할 수있는 답변을 신속하게 추가하고 싶었습니다 l["name"] <- NULL. 예를 들면 다음과 같습니다.

l <- list(a = 1, b = 2, cc = 3)
l['b'] <- NULL

명명 된 목록의 경우 도우미 기능이 유용하다는 것을 알았습니다.

member <- function(list,names){
    ## return the elements of the list with the input names
    member..names <- names(list)
    index <- which(member..names %in% names)
    list[index]    
}


exclude <- function(list,names){
     ## return the elements of the list not belonging to names
     member..names <- names(list)
     index <- which(!(member..names %in% names))
    list[index]    
}  
aa <- structure(list(a = 1:10, b = 4:5, fruits = c("apple", "orange"
)), .Names = c("a", "b", "fruits"))

> aa
## $a
##  [1]  1  2  3  4  5  6  7  8  9 10

## $b
## [1] 4 5

## $fruits
## [1] "apple"  "orange"


> member(aa,"fruits")
## $fruits
## [1] "apple"  "orange"


> exclude(aa,"fruits")
## $a
##  [1]  1  2  3  4  5  6  7  8  9 10

## $b
## [1] 4 5

lapply와 grep 사용하기 :

lst <- list(a = 1:4, b = 4:8, c = 8:10)
# say you want to remove a and c
toremove<-c("a","c")
lstnew<-lst[-unlist(lapply(toremove, function(x) grep(x, names(lst)) ) ) ]
#or
pattern<-"a|c"
lstnew<-lst[-grep(pattern, names(lst))]

숫자 색인을 피하려면 다음을 사용할 수 있습니다

a <- setdiff(names(a),c("name1", ..., "namen"))

namea...namena에서 이름을 삭제하려면 이것은 목록에서 작동합니다

> l <- list(a=1,b=2)
> l[setdiff(names(l),"a")]
$b
[1] 2

벡터뿐만 아니라

> v <- c(a=1,b=2)
> v[setdiff(names(v),"a")]
b 
2

이것은 어떤가요? 다시, 인덱스를 사용하여

> m <- c(1:5)
> m
[1] 1 2 3 4 5

> m[1:length(m)-1]
[1] 1 2 3 4

또는

> m[-(length(m))]
[1] 1 2 3 4

사용할 수 있습니다 which.

x<-c(1:5)
x
#[1] 1 2 3 4 5
x<-x[-which(x==4)]
x
#[1] 1 2 3 5

참고 URL : https://stackoverflow.com/questions/652136/how-can-i-remove-an-element-from-a-list

반응형