0

R でリストのリストを作成しようとしています。まず、事前に指定された長さのリストのリストを作成します。次に、for ループを使用してマトリックスを反復処理し、リストを埋めます。

問題は、リストのリストのリストなどを取得しているように見えることです.

私のコード:

potential_dups <- rep(list(list()), 10)
nearest10 <- matrix(rnorm(100), nrow=10)

for (i in 1:length(nearest10[ , 1])) {
  for (j in 1:10) {
    if (nearest10[i, j] < 0.35 && nearest10[i, j] > 0) {
      potential_dups[[i]] <- append(potential_dups[[i]], nearest10[i, j])
    }
  } 
}  

なぜこうなった?この形式のリストを作成するにはどうすればよいですか?

[[1]]
[1] "Element 1A"
[[1]]
[2] "Element 1B"
[[1]]
[3] "Element 1C"

[[2]]
[1] "Element 2A"
[[2]]
[2] "Element 2B"

さらに、次のように表示される空のリストになってしまいます。 [[3]] list() 最初の要素は NULL です。さらに、このデータ構造から空でないリストのみをサブセット化するスクリプトを書きたいと思います。

4

2 に答える 2

1

Altough your example isn't reproducible, I get a list of lists with the following similar code:

potential_dups <- rep(list(list()), 10)
nearest10 <- matrix(rnorm(100), nrow=10)
for (i in 1:10) {
  for (j in 1:10) {
    if (nearest10[i, j] < 0.35 & nearest10[i, j] > 0) {
      potential_dups[[i]] <- append(potential_dups[[i]], nearest10[i, j])
    }
  } 
}  

To remove empty lists you can do this:

potential_dups[sapply(potential_dups, function(x) length(x) > 0)]
于 2013-07-10T14:45:59.607 に答える
0

より良い(より読みやすく、より効率的な)方法は次のとおりです。

mat <- nearest10
mat[mat >= 0.35 | mat <= 0] <- NA
potential_dups <- apply(mat,1,function(x) as.list(na.omit(x)))

ただし、なぜこの出力が必要なのか想像できません。それは最も有用ではないようです。代わりに次を使用できますか?

potential_dups <- apply(mat,1,function(x) c(na.omit(x)))
于 2013-07-10T14:58:05.333 に答える