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


275

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

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


값 (예 : "값 5") 또는 "인덱스 5의 요소"또는 "지수 c (5 : 6,10)의 색인 / 표시로 값을 제거 하시겠습니까? 값으로 제거하려는 경우 중복 항목 인 경우 중복 항목, 첫 번째 또는 마지막 항목 또는 모두 만 제거 하시겠습니까? 목록에 요소 / 인덱스가 포함되어 있는지 확인합니까? 목록이 비어있는 경우를 처리해야합니까? NA가 통과 (/ 제외)되었는지 확인 하시겠습니까? 목록이 평평하거나 중첩 될 수 있습니까? 나중에 몇 명이 깊습니까?
smci

2
setdiff (myList, elementToRemove)
JStrahl

답변:


218

나는 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로 설정하지 마십시오. 목록에서 해당 구성 요소가 제거되기 때문입니다.

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

그것이 올바른 방향으로 당신을 도우거나 최소한 이끌어 줄 희망입니다.


5
감사합니다. mylist [i] <-NULL이 바로 그 방법입니다.
David Locke

37
이것은 나를 위해 작동하지 않았습니다. Error in list[length(list)] <- NULL : replacement has length zero
wfbarksdale

3
@Aleksandr Levchuck의 포스트는 제가 실제로 벡터를 다루고 있고 새로운 객체를 만들어야한다는 것을 보여주었습니다
wfbarksdale

209

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

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

4
논리 색인은 목록 요소에 단일 항목 "b"가있는 경우에만 작동합니다. 당신은, 말, 제거 할 수 없습니다 x$b그렇게 않으며, 당신은 목록 요소에서 "B"를 제거 할 수 있습니다 x[[2]] = c("b","k") .
Carl Witthoft

단일 항목과 여러 항목의 경우 : 여러 항목에 %in%대한 테스트에 사용할 수 있습니다 . "x $ b를 제거 할 수 없습니다"라는 의미가 무엇인지 잘 모르겠습니다. 전체 열을 제거한다는 의미 b입니까?
Florian Jenn

30

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

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

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

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

@krlmlr : 반대로,이 솔루션은 컬렉션 유형에 다형성이기 때문에 Florian의 답변보다 더 일반적입니다.
Dan Barowy

@ DanBarowy : 나는 틀렸다 : 이것은 Chad의 대답 (허용되는 것)과 Florian의 것 인 것 같습니다 ...하지만 간단한 요약.
krlmlr

19

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

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

건배


2
이 코드 x는 빈 목록 인 경우 중단됩니다 . 사용 compact에서 plyr대신이 작업.
Richie Cotton

또한 목록에 null이 없으면 해당 행을 완전히 삭제하는 -(which(sapply(x,is.null),arr.ind=TRUE))반환 named integer(0)값이 있습니다.
user3055034

17

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

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

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

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

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


1
여러 작업을 수행within(l, rm(a, b))
Vlad

16

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

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)


10

다양한 종류의 목록 작업을 처리하기 위한 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

이 예제에서 어떻게 파이썬이나 랭 아이템을 제거 할 수 있습니까?
Arthur Yip

9

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

보다 정확하게

myList[[5]] <- NULL

오류가 발생합니다

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

또는

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

내가 더 일관되게 일한 것은

myList <- myList[[-5]]

1
좋은 대답입니다! 그러나 나는 [[-5]]단일 대괄호 여야 한다고 생각합니다 . 그렇지 않으면 요소 자체가 아닌 해당 목록 요소의 내용 만 선택 취소합니다. 적어도 이중 대괄호를 사용하면 "하나 이상의 요소를 선택하려고합니다"라는 오류가 발생합니다. 나를 위해 일한 것은 다음과 같습니다 myList <- myList[-5].
n1k31t4

4

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

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

4

-요소의 위치와 함께 (음수)를 사용하십시오 . 예를 들어 세 번째 요소를 제거 해야하는 경우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

2

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

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

0

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))]

-1

이건 어때요? 다시 인덱스를 사용하여

> 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

1
m은 목록이 아닌 벡터입니다.
C8H10N4O2

1
이 방법은 목록에서 작동하지만 OP는 운이 m[1:(length(m) - 1)]
좋으며

-1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.