如何返回具有2个以上唯一值的所有行?

时间:2012-09-28 19:00:47

标签: r

现在我有一个名为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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以获取跨行应用lengthunique项的索引。 mat将用作包含项目的矩阵的名称。

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

您现在可以根据该索引选择行。

mat[ind,]

答案 2 :(得分: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

答案 3 :(得分:0)

> ind <- apply(x, 1, function(x) length(unique(x)))
> ind
[1] 1 1 3