R个唯一列或行与NA

时间:2016-01-06 03:49:55

标签: r unique na

任何人都知道incomparablesunique()的{​​{1}}参数是否已在[{1}}之后实施?

也许我不明白它应该如何运作......

无论如何,我正在寻找一个灵活的解决方案,除了额外的duplicated()之外,只保留与另一列相同的唯一列(或行)?例如,我可以使用incomparables=FALSE来强制它,但对于数万列,这是难以处理的。

这是一个例子,抱歉,如果它有点乱,但我认为这说明了重点。制作一些矩阵NA

cor()

让我们添加一些带有额外z的重复列,然后对这些列进行随机化(这样他们并不总是在最后)。

z <- matrix(sample(c(1:3, NA), 100, replace=TRUE), 10, 10)
colnames(z) <- paste("c", 1:10, sep="")
rownames(z) <- paste("r",1:10, sep="")

所以我可以根据丢失的数字排序,然后看起来好像NAc3.1 <- z[, 3] c3.1[sample(1:10, 3)] <- NA c8.1 <- z[, 8] c8.1[sample(1:10, 5)] <- NA z <- cbind(z, c3.1, c8.1) z <- z[, sample(1:ncol(z))] 会起作用,但它不喜欢忽略丢失。

duplicated()

我认为这是unique()参数专门针对的内容,但它似乎尚未实现:

missing <- apply(z, 2, function(x) {length(which(is.na(x)))})
z.sorted <- z[, order(missing)]

z.sorted[,!duplicated(z.sorted,MARGIN=2)]
unique(z.sorted,MARGIN=2)

我知道我很快就会找到一个不那么优雅的解决方案,我想我更想问为什么还没有实现呢?或者如果我只是错误地使用它。似乎我经常碰到这个,但我搜索了很长一段时间而没有找到答案。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

正如您所怀疑的那样,对于data.frame的{​​{1}}和matrix方法,unique尚未实施。 在默认方法中实现,该方法用于没有dims的向量。 E.g:

incomparables != FALSE

查看unique(c(1, 2, 2, 3, 3, 3, NA, NA, NA), incomparables=2) ## [1] 1 2 2 3 NA unique(c(1, 2, 2, 3, 3, 3, NA, NA, NA), incomparables=NA) ## [1] 1 2 3 NA NA NA unique.matrix的来源(只需在控制台中键入功能名称并点击unique.default,或在RStudio中按Enter打开新窗格中的源代码。)

在您的情况下,您可以使用F2创建一个矩阵,指明特定的行/列对是否相同,忽略outer s。

NA

然后,如果你想只保留那些与第二列相同的列(对我来说是列same <- outer(seq_len(ncol(z)), seq_len(ncol(z)), Vectorize(function(x, y) all(z[, x]==z[, y], na.rm=TRUE))) same ## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] ## [1,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE ## [2,] FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE ## [3,] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE ## [4,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE ## [5,] FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE ## [6,] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE ## [7,] FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE ## [8,] FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE ## [9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE ## [10,] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE ## [11,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE ## [12,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE ),请参阅本文的底部以获取完整的c8.1矩阵我用过),你可以这样做:

z

要将矩阵缩减为唯一的列集(忽略z[, same[2, ]] # or, equivalently, z[, same[, 2]] ## c8.1 c8 ## r1 2 2 ## r2 1 1 ## r3 NA 3 ## r4 NA 1 ## r5 3 3 ## r6 NA 1 ## r7 2 2 ## r8 NA 1 ## r9 3 3 ## r10 NA 1 ),并且NA s的数量最少,您可以执行以下操作:

NA

供参考,以下是我正在使用的z[, unique(sapply(apply(same, 2, which), function(x) x[which.min(colSums(is.na(z))[x])]))] ## c7 c8 c3 c1 c6 c10 c2 c9 c4 ## r1 2 2 1 2 1 1 1 2 NA ## r2 3 1 3 1 3 NA 1 2 2 ## r3 2 3 2 3 1 NA 2 1 NA ## r4 2 1 1 2 2 1 3 NA 2 ## r5 NA 3 2 1 3 2 NA NA 3 ## r6 2 1 2 2 1 1 2 1 NA ## r7 2 2 2 2 NA 3 1 2 2 ## r8 NA 1 1 3 2 NA 1 NA 1 ## r9 1 3 3 2 NA 2 1 NA 2 ## r10 NA 1 1 NA 1 1 1 2 3

z