r - 如何从每个唯一标识符的不同行中删除重复值?
问题描述
我刚刚开始使用 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
提前致谢。
解决方案
根据您的示例,尚不清楚 NA 是否也可以出现在中间,以及您希望如何处理这种情况(例如 make 1 NA 1
to 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
推荐阅读
- javascript - 执行删除操作后如何自动刷新页面
- image - 将未压缩的 TIF 文件转换为具有压缩 LZW 和 ZIP 的 TIF 文件
- python - 如何从 github 安装 deepplantphenomics python 包?
- java - E/RecyclerView:没有附加适配器;跳过布局 Android Studio RecyclerView
- python - boto3 AWS Batch在`.describe_jobs()`响应中缺少`logStreamName`
- java - GUI 问题 Java Netbeans 将 TextFields 与数字相关联
- python - 如何计算对比度改善指数 (CII)
- android - Playstore:停用此 APK 将导致您的应用可用于在更少类型的设备上进行新安装
- macos - 错误:没有名称为“chromedriver”的可用公式
- firebase - 带有firestore的Stream提供程序在flutter中出现问题