gpt4 book ai didi

R 与 NA 无法比拟的唯一列或行

转载 作者:行者123 更新时间:2023-12-04 12:32:30 25 4
gpt4 key购买 nike

有谁知道incomparables unique() 的论据或 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="")

让我们添加几个重复的列和额外的 NA s,并随机化列,(这样它们并不总是在最后)。
c3.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)

我想这就是 incomparables参数是专门针对的,但似乎尚未实现:
z.sorted[,!duplicated(z.sorted,MARGIN=2,incomparables=NA)]
unique(z.sorted,MARGIN=2,incomparables=NA)

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

最佳答案

正如您所怀疑的,对于 data.framematrix unique 的方法, 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 (只需在控制台中输入函数名称并点击 Enter ,或在 RStudio 中按 F2 即可在新 Pane 中打开源代码)。

在你的情况下,你可以使用 outer创建一个矩阵,指示特定的行/列对是否相同,忽略 NA s。
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 ),并且具有最少数量的 NA s,然后您可以执行以下操作:
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我正在与:
    c7 c8.1 c3 c1 c5 c10 c8 c6 c2 c3.1 c9 c4
r1 2 2 1 2 1 1 2 1 1 1 2 NA
r2 3 1 3 1 3 NA 1 3 1 3 2 2
r3 2 NA 2 3 1 NA 3 1 2 2 1 NA
r4 2 NA 1 2 NA 1 1 2 3 NA NA 2
r5 NA 3 2 1 3 2 3 3 NA 2 NA 3
r6 2 NA 2 2 1 1 1 1 2 2 1 NA
r7 2 2 2 2 1 3 2 NA 1 2 2 2
r8 NA NA 1 3 NA NA 1 2 1 NA NA 1
r9 1 3 3 2 1 2 3 NA 1 NA NA 2
r10 NA NA 1 NA NA 1 1 1 1 1 2 3

关于R 与 NA 无法比拟的唯一列或行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34625319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com