现在我有一个名为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来说相当新,所以如果你认为有更好的方法可以解决这个问题,我也会对此持开放态度。
答案 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)
您可以获取跨行应用length
个unique
项的索引。 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