首页 > 解决方案 > 如何从每个唯一标识符的不同行中删除重复值?

问题描述

我刚刚开始使用 R。我在第一列唯一标识符(1958 名患者)和第2-35 列 0's en 1's中有一个数据集。

例如:

Patient A:  0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 NA NA 

我想将其更改为:

Patient A: 0 1 0 1 0 1

提前致谢。

标签: rdataframeduplicates

解决方案


根据您的示例,尚不清楚 NA 是否也可以出现在中间,以及您希望如何处理这种情况(例如 make 1 NA 1to 1 1(option 1) 并因此将两个 1 结合起来,或者 NA 是否会标记边界并且您将保留两个 1(选项 2)。这决定了在什么时候删除代码中的 NA。

您可以使用S4Vectors运行长度编码,这将允许您拥有的不仅仅是 0 和 1。

library(S4Vectors)

## create example data
set.seed(1)
x <- sample(c(0,1), (1958*34), replace=TRUE, prob=c(.4, .6))
x[sample(length(x), 200)] <- NA
x <- matrix(x, nrow=1958, ncol=34)
df <- data.frame(patient.id = paste0("P", seq_len(1958)), x, stringsAsFactors = FALSE)

## define function to remove NA values
# option 1
fun.NA.boundary <- function(x) {
    a <- runValue(Rle(x))
    a[!is.na(a)]
}
# option 2
fun.NA.remove <- function(x) runValue(Rle(x[!is.na(x)]))

## calculate results
# option 1
reslist <- apply(x[,-1], 1, function(y) fun.NA.boundary(y))

# option 2
reslist <- apply(x[,-1], 1, function(y) fun.NA.remove(y))

names(reslist) <- df$patient.id
head(reslist)
#> $P1
#>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
#> 
#> $P2
#>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
#> 
#> $P3
#>  [1] 0 1 0 1 0 1 0 1 0 1 0 1 0 1
#> 
#> $P4
#>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
#> 
#> $P5
#>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
#> 
#> $P6
#>  [1] 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0

推荐阅读