我有如下的示例数据(实际数据是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%的样本 - 行。
答案 0 :(得分:1)
这是一个让你玩的功能。希望您可以根据自己的需要进行修改:
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
我不知道你将如何使用它,我不确定这是否有用....
答案 1 :(得分:0)
也许你可以使用apply
函数:
count.na <- function(vec) { return (length(which(is.na(vec)))) }
最后选择百分比为NA
的列和行