2015-10-07 33 views
14
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です。私はそれらを削除したいが、空でない要素のインデックスを保持する。R:リストからNULL要素を削除する

mylist2 = mylist[-which(sapply(mylist, is.null))] 
> mylist2 
[[1]] 
[1] 123 

[[2]] 
[1] 456 

これはうまくNULL要素を削除しますが、私は空でない要素がインデックスを再作成することにしたくない、すなわち、私はmylist2が空でないエントリのインデックスが保存されている。このようなものを、見てみたいです。

> mylist2 
[[11]] 
[1] 123 

[[13]] 
[1] 456 
+0

誰かが道を見つけるかもしれませんが、私はあなたが「なぜそれはそのように印刷されていますか?」という罠に陥っていると思います。これらのインデックス番号はあなたのリスト要素の名前ではありません。名前はありません。 '名前(mylist)'をチェックしてください。だから彼らは要素がリストのどこにあるのかを示すヘルパーです。そのため、2つの要素だけでリストの11番目の位置を返すようにRに指示するのは難しいです。あなたは以下の答えとしてリストに名前を付けることができます。 –

答えて

24

です。

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 
4

あなたが

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]]となります。

+0

これはあなたが実際に行うことができるものに最も近いものです。 –

2

ここでは、あなたが得ることができるでしょう最も近い最初のリスト要素に名前を付け、その後、NULLを削除することです便利な連鎖表記

library(magrittr) 

mylist %>% 
    setNames(seq_along(.)) %>% 
    Filter(. %>% is.null %>% `!`, .) 
+6

'Filter(Negate(is.null)、setNames(L、seq_along(L)))'はかなり読みやすいです。 – thelatemail

+0

[OK]をクリックして問題を解決しました。否定!= '!' – bramtayl

2

リストのすべてのヌルエントリを自動的に削除する機能があります。リストに名前が付けられている場合は、ヌル以外のエントリの名前が保持されます。

この機能はplyrからcompactと呼ばれます。

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) 
関連する問題