リストがあり、そこから1つの要素を削除したい。これどうやってするの?
この関数のわかりやすい名前がリファレンスマニュアルにあると思いますが、適切なものは何も見つかりませんでした。
リストがあり、そこから1つの要素を削除したい。これどうやってするの?
この関数のわかりやすい名前がリファレンスマニュアルにあると思いますが、適切なものは何も見つかりませんでした。
回答:
私はRをまったく知りませんが、少し創造的なグーグルで私をここに導きました: http://tolstoy.newcastle.edu.au/R/help/05/04/1919.html
そこからの主な引用:
リストから要素を削除する方法に関するRの明示的なドキュメントは見つかりませんが、試行錯誤で教えてくれます
myList [[5]] <-NULL
5番目の要素を削除し、その要素の削除によって生じた穴を「閉じます」。これでインデックス値が乱れるので、要素の削除には注意が必要です。リストの後ろから前に向かって仕事をしなければなりません。
リストの要素を削除するには、R FAQ 7.1を参照してください
そして、R FAQの関連するセクションは言う:
...対応するコンポーネントがリストから削除されるため、x [i]またはx [[i]]をNULLに設定しないでください。
要素を削除する方法を(多少逆向きに)教えてくれているようです。
それが役立つか、少なくともあなたを正しい方向に導くことを願っています。
Error in list[length(list)] <- NULL : replacement has length zero
リストをインプレースで変更したくない場合(たとえば、要素が削除されたリストを関数に渡す場合)、インデックスを使用できます。負のインデックスは「この要素を含めない」ことを意味します。
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
x$b
そのように削除したり、リスト要素から「b」を削除したりすることはできませんx[[2]] = c("b","k")
。
%in%
に対するテストに使用できます。「x $ bを削除できません」という意味がわかりませんb
。列全体を削除するということですか?
以下は、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要素を1行で削除する:
x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]
乾杯
x
が空のリストの場合、このコードは機能しません。代わりに、このタスクにはcompact
from plyr
を使用してください。
-(which(sapply(x,is.null),arr.ind=TRUE))
返しますnamed integer(0)
。
さまざまな種類のリスト操作を処理するための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
これに対する答えがまだ必要かどうかはわかりませんが、NULL
特に動的に更新している場合は、割り当ての使用が実際には間違っているか、最適ではないという、Rの限られた(3週間の自己学習R)経験からわかったforループのようなリスト。
より正確に言うと、
myList[[5]] <- NULL
エラーをスローします
myList [[5]] <-NULL:置換の長さがゼロです
または
交換するよりも多くの要素が提供されています
私がより一貫して機能することがわかったのは
myList <- myList[[-5]]
[[-5]]
単一の角括弧である必要があると思います。そうでない場合は、要素自体ではなく、そのリスト要素のコンテンツのみを選択解除します。少なくとも、二重の角括弧を使用すると、「複数の要素を選択しようとしています」というエラーが表示されます。そのとき私にとってうまくいったのは:myList <- myList[-5]
でした。
名前付きリストの場合は、も追加できることをすぐに追加したかったのですが(回答の中にそれが表示されなかったため)l["name"] <- NULL
。例えば:
l <- list(a = 1, b = 2, cc = 3)
l['b'] <- NULL
-
要素の位置とともに(負符号)を使用します。たとえば、3番目の要素を削除する場合は、次のように使用します。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
名前付きリストの場合、これらのヘルパー関数は便利です
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
これはどう?ここでも、インデックスを使用します
> 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
m[1:(length(m) - 1)]
数値インデックスを避けたい場合は、
a <- setdiff(names(a),c("name1", ..., "namen"))
namea...namen
aから名前を削除します。これはリストで機能します
> 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