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

我想做的是返回行数据以及该行的索引,其中有两个以上的唯一值。在上面的示例中,这只是第三行。到目前为止,我已经部分成功地使用apply了我创建的功能。见下文:

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

我的问题是,这也会返回前两条记录的空行。输出:

[[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

您可以获取跨行应用lengthunique项目的索引。 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]

或者,扩展 Patrick Li 的回答:

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 回答