0

現在closest.labels、次のデータを含むというベクトルがあります。

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    2    2    2    2    2    2    2    2    2     2
[2,]    0    0    0    0    0    0    0    0    0     0
[3,]    9    9    9    9    9    9    9    7    7     4

私がやりたいのは、行データと、3つ以上の一意の値があるその行のインデックスを返すことです。上記の例では、これは3行目のみになります。applyこれまでのところ、私が作成した関数を使用して部分的に成功しています。下記参照:

colCountFx <- function(col){
    result <- subset(list(index=col,count=length(unique(col))),length(unique(col))>2)
    return(result)
}
apply(closest.labels,1, colCountFx)

私の問題は、これにより、最初の2つのレコードでも空の行のように見えるものが返されることです。出力:

[[1]]
named list()

[[2]]
named list()

[[3]]
[[3]]$index
 [1] 9 9 9 9 9 9 9 7 7 4

[[3]]$count
[1] 3

現在返されている行に対して何も返されないようにするには、何を変更する必要がありnamed list()ますか?また、私はRにかなり慣れていないので、これを行うためのより良い方法があると思われる場合は、私もそれを受け入れます。

4

4 に答える 4

1

length行全体にunique適用されたアイテム のインデックスを取得できます。matアイテムを含むマトリックスの名前として使用されます。

nUnique <- apply( mat, 1, function(x) length(unique(x)) )
ind <- which(nUnique > 2)

そのインデックスに基づいて行を選択できます。

mat[ind,]
于 2012-09-28T19:24:08.050 に答える
1

別のインデックスを使用して、空のリストを削除できます。言う:

remaining <- apply(closest.labels,1, colCountFx)
remaining.ind <- sapply(remaining,length) != 0
remaining[remaining.ind]

または、PatrickLiの答えを拡張します。

ind <- apply(closest.labels, 1, function(x) length(unique(x)))
which(ind > 2) #indices of rows that have more than 2 unique values
closest.labels[which(ind > 2),] #rows that have at least one unique value
于 2012-09-28T19:05:34.610 に答える
1

それがlistあなたが望んでいるのであれば、あなたはこのようなことを試すことができます。個人的には、ネストされたリストはやや面倒だと思います。

まず、いくつかのデータ(わかりやすくするために行を追加しました):

closest.labels <- structure(c(2, 0, 9, 8, 2, 0, 9, 8, 2, 0, 9, 8, 2, 0, 9, 8, 2, 
                              0, 9, 8, 2, 0, 9, 5, 2, 0, 7, 6, 2, 0, 7, 7, 2, 0, 
                              4, 8, 2, 0, 4, 9), .Dim = c(4L, 10L))

次に、変更された関数:

colCountFx <- function(data) {
  temp = apply(data, 1, function(x) length(unique(x)))
  result = which(temp > 2)
  out = vector("list")
  for (i in 1:length(result)) {
    out[[i]] = list(index = data[result[i], ], count = temp[result[i]])
  }
  names(out) = paste("row", result, sep = "_")
  out
}

それをテストしてみましょう:

colCountFx(closest.labels)
# $row_3
# $row_3$index
# [1] 9 9 9 9 9 9 7 7 4 4
# 
# $row_3$count
# [1] 3
# 
# 
# $row_4
# $row_4$index
# [1] 8 8 8 8 8 5 6 7 8 9
# 
# $row_4$count
# [1] 5
于 2012-09-28T19:32:58.093 に答える
0
> ind <- apply(x, 1, function(x) length(unique(x)))
> ind
[1] 1 1 3
于 2012-09-28T19:04:15.110 に答える