我有以下示例数据(实际数据为150x200),并且需要保持行和列的最佳组合,这样才能使NA最少。我可以使用,complete.cases()
但是它删除了太多的行。
仅通过查看此示例,显然可以排除x6行,因为它具有最多的NA
计数。同样,我们可以排除A和F列,因为它们的NA
计数最多。
需要一些逻辑提示,不必是完整的代码解决方案。
#reproducible data
df <- read.csv(text="
SampleID,A,B,C,D,E,F
x1,NA,x,NA,x,NA,x
x2,x,x,NA,x,x,NA
x3,NA,NA,x,x,x,NA
x4,x,x,x,NA,x,x
x5,x,x,x,x,x,x
x6,NA,NA,NA,x,NA,NA
x7,x,x,x,NA,x,x
x8,NA,NA,x,x,x,x
x9,x,x,x,x,x,NA
x10,x,x,x,x,x,x
x11,NA,x,x,x,x,NA")
# complete cases
df[ complete.cases(df),]
# SampleID A B C D E F
#5 x5 x x x x x x
#10 x10 x x x x x x
附加信息:这是用于风险计算的数据,行是样本,列是变量。每个变量都有一些值的风险因子。例如,风险预测算法(使用不同的定制软件计算)可以使用5个变量或200个变量。变量越多,答案显然越可靠。为了获得可比的结果,大多数样本应具有最多的重叠变量。我将需要保留至少〜60%的样本-行。
这是您可以使用的功能。希望您可以根据自己的需要进行修改:
almostComplete <- function(dataset, rowPct, colPct = rowPct, n = 1) {
if (sum(is.na(dataset)) == 0) out <- dataset
else {
CS <- colSums(is.na(dataset))/ncol(dataset)
RS <- rowSums(is.na(dataset))/nrow(dataset)
if (is.null(rowPct)) rowPct <- head(sort(RS, decreasing=TRUE), n)[n]
if (is.null(colPct)) colPct <- head(sort(CS, decreasing=TRUE), n)[n]
dropCols <- which(CS >= colPct)
dropRows <- which(RS >= rowPct)
out <- dataset[setdiff(sequence(nrow(dataset)), dropRows),
setdiff(sequence(ncol(dataset)), dropCols)]
}
out
}
一些例子...
删除具有最高NA值百分比的行和列:
almostComplete(df, NULL, NULL)
# SampleID B C D E
# 1 x1 x <NA> x <NA>
# 2 x2 x <NA> x x
# 3 x3 <NA> x x x
# 4 x4 x x <NA> x
# 5 x5 x x x x
# 7 x7 x x <NA> x
# 8 x8 <NA> x x x
# 9 x9 x x x x
# 10 x10 x x x x
# 11 x11 x x x x
删除NA值第二高的行和列。
almostComplete(df, NULL, NULL, n = 2)
# SampleID B C D E
# 2 x2 x <NA> x x
# 4 x4 x x <NA> x
# 5 x5 x x x x
# 7 x7 x x <NA> x
# 8 x8 <NA> x x x
# 9 x9 x x x x
# 10 x10 x x x x
# 11 x11 x x x x
为行和列设置一个阈值。
almostComplete(df, .7)
# SampleID B C D E
# 1 x1 x <NA> x <NA>
# 2 x2 x <NA> x x
# 3 x3 <NA> x x x
# 4 x4 x x <NA> x
# 5 x5 x x x x
# 6 x6 <NA> <NA> x <NA>
# 7 x7 x x <NA> x
# 8 x8 <NA> x x x
# 9 x9 x x x x
# 10 x10 x x x x
# 11 x11 x x x x
分别指定行和列阈值。
almostComplete(df, .2, .5)
# SampleID B C D E
# 2 x2 x <NA> x x
# 4 x4 x x <NA> x
# 5 x5 x x x x
# 7 x7 x x <NA> x
# 8 x8 <NA> x x x
# 9 x9 x x x x
# 10 x10 x x x x
# 11 x11 x x x x
不知道确切地将如何使用它,我不确定这是否有用...。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句