Зависит от того, хотите ли вы удалить его по значению, например, «значение 5», или по индексу / индексам «элемент по индексу 5» или «по индексам с (5: 6,10)?» Если вы хотите удалить по значению и там являются дубликатами, то хотите ли вы удалить только дубликаты, первое или последнее вхождение или все? Гарантируется, что список содержит ваш элемент / индекс? Нужно ли нам обрабатывать случай, когда список пуст? Нужно ли нам гарантировать, что NA пропущен (/ исключен)? Гарантируется ли, что список будет плоским или может быть вложенным? Сколько будет позже?
Я не нахожу явной документации для R о том, как удалять элементы из списков, но метод проб и ошибок подсказывает мне
myList [[5]] <- NULL
удалит 5-й элемент, а затем "закроет" дыру, вызванную удалением этого элемента. Это превышает значения индекса, поэтому я должен быть осторожен при отбрасывании элементов. Я должен работать от конца списка до фронта.
Спасибо, mylist [i] <- NULL - это как раз то, что нужно.
Дэвид Лок
37
Это не сработало для меня. Я получаю:Error in list[length(list)] <- NULL : replacement has length zero
wfbarksdale
3
Сообщение Александра Левчука показало мне, что я на самом деле имел дело с вектором и мне нужно было создать новый объект
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
Ваш логический индекс работает, только если у вас есть этот единственный элемент «b» в элементе списка. Вы не можете удалить, скажем, x$bтаким образом, а также не можете удалить «b» из элемента списка x[[2]] = c("b","k") .
Карл Виттофт
Относительно одного против нескольких предметов: вы можете использовать %in%для тестирования нескольких предметов. Я не уверен, что вы подразумеваете под «не могу удалить x $ b» - вы имеете в виду удаление всего столбца b?
Флориан Дженн
30
Вот как удалить последний элемент списка в R:
x <- list("a","b","c","d","e")
x[length(x)]<-NULL
Если x может быть вектором, вам нужно создать новый объект:
Если у вас есть именованный список и вы хотите удалить определенный элемент, вы можете попробовать:
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)
Как можно удалить элементы Python или Lang в этом примере?
Артур Йип
9
Не знаю, нужен ли вам ответ на этот вопрос, но из моего ограниченного (самообучающегося R) опыта работы с R я узнал, что использование NULLназначения на самом деле неправильно или неоптимально, особенно если вы динамически обновляете список в чем-то вроде цикла for.
Чтобы быть более точным, используя
myList[[5]]<-NULL
выдаст ошибку
myList [[5]] <- NULL: длина замены равна нулю
или
поставлено больше элементов, чем нужно заменить
То, что я нашел, чтобы работать более последовательно,
Хороший ответ! Однако я думаю, что это [[-5]]должны быть одинарные квадратные скобки, в противном случае вы отменяете выделение только содержимого этого элемента списка, а не самого элемента. Ну, по крайней мере, использование двойных квадратных скобок дает мне такую ошибку: «попытка выбрать более одного элемента». Что работает для меня тогда: myList <- myList[-5].
n1k31t4
4
Просто хотел быстро добавить (потому что я не видел этого ни в одном из ответов), что для именованного списка вы также можете сделать l["name"] <- 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
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))]
Ответы:
Я вообще не знаю R, но немного творческого поиска привели меня сюда: http://tolstoy.newcastle.edu.au/R/help/05/04/1919.html
Ключевая цитата оттуда:
Ответ на этот пост позже в потоке состояний:
И соответствующий раздел R FAQ содержит следующее:
Который, кажется, говорит вам (несколько назад), как удалить элемент.
Надеюсь, что это помогает, или, по крайней мере, ведет вас в правильном направлении.
источник
Error in list[length(list)] <- NULL : replacement has length zero
Если вы не хотите изменять список на месте (например, для передачи списка с удаленным элементом в функцию), вы можете использовать индексирование: отрицательные индексы означают «не включать этот элемент».
Также полезны векторы логического индекса:
Это работает и с датафреймами:
источник
x$b
таким образом, а также не можете удалить «b» из элемента спискаx[[2]] = c("b","k")
.%in%
для тестирования нескольких предметов. Я не уверен, что вы подразумеваете под «не могу удалить x $ b» - вы имеете в виду удаление всего столбцаb
?Вот как удалить последний элемент списка в R:
Если x может быть вектором, вам нужно создать новый объект:
источник
Удаление пустых элементов из списка в одну строку:
x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]
ура
источник
x
пустой список. Используйтеcompact
отplyr
для этой задачи вместо.-(which(sapply(x,is.null),arr.ind=TRUE))
возвращаетсяnamed integer(0)
, что полностью отбрасывает эту строку.Я хотел бы добавить, что если это именованный список, вы можете просто использовать
within
.Таким образом, вы можете переписать оригинальный список
удалить элемент с именем
a
из спискаl
.источник
within(l, rm(a, b))
Если у вас есть именованный список и вы хотите удалить определенный элемент, вы можете попробовать:
Это позволит сделать список
lst
с элементамиa
,b
,c
. Вторая строка удаляет элементb
после того, как проверит, что он существует (чтобы избежать упомянутой проблемы @hjv).или лучше:
Таким образом, это не проблема, чтобы попытаться удалить несуществующий элемент (например
lst$g <- NULL
)источник
Существует пакет rlist ( http://cran.r-project.org/web/packages/rlist/index.html ) для работы с различными видами операций со списками.
Пример ( http://cran.r-project.org/web/packages/rlist/vignettes/Filtering.html ):
Результаты в:
источник
Не знаю, нужен ли вам ответ на этот вопрос, но из моего ограниченного (самообучающегося R) опыта работы с R я узнал, что использование
NULL
назначения на самом деле неправильно или неоптимально, особенно если вы динамически обновляете список в чем-то вроде цикла for.Чтобы быть более точным, используя
выдаст ошибку
или
То, что я нашел, чтобы работать более последовательно,
источник
[[-5]]
должны быть одинарные квадратные скобки, в противном случае вы отменяете выделение только содержимого этого элемента списка, а не самого элемента. Ну, по крайней мере, использование двойных квадратных скобок дает мне такую ошибку: «попытка выбрать более одного элемента». Что работает для меня тогда:myList <- myList[-5]
.Просто хотел быстро добавить (потому что я не видел этого ни в одном из ответов), что для именованного списка вы также можете сделать
l["name"] <- NULL
. Например:источник
Используйте
-
(отрицательный знак) вместе с положением элемента, например, если третий элемент должен быть удален, используйте его какyour_list[-3]
вход
Удалить один элемент из списка
Удалить несколько элементов из списка
источник
В случае именованных списков я нахожу эти вспомогательные функции полезными
источник
Использование lapply и grep:
источник
Как насчет этого? Опять же, используя индексы
или
источник
m[1:(length(m) - 1)]
если вы хотите избежать числовых индексов, вы можете использовать
удалить имена
namea...namen
из. это работает для спискова также для векторов
источник
Вы можете использовать
which
.источник
list