【发布时间】:2019-09-13 05:46:59
【问题描述】:
我有一个最终将转换为xts 对象的数据框。第一列包含日期数据,而所有其他列包含数字数据。但是,并非所有数字列都具有相同数量的值/相同的长度。有些列包含的 NA 行比其他列多。
我想通过删除 NA 数量最少的列中包含 NA 的行来过滤我的数据框,但仍为我选择的所有其他列保留包含 NA 的行。例如,下面的列 grpA 的 NA 数量最少。我想删除包含 NA 的数据帧的前 2 行,但保留 grpB 中的值,无论它们是什么。
我有什么:
Date grpA grpB
2007-11-06 NA NA
2007-11-07 NA NA
2007-11-09 1.66 NA
2007-11-12 1.64 NA
2007-11-13 1.61 1.28
2007-11-14 1.60 1.30
2007-11-15 1.57 1.27
2007-11-16 1.56 1.25
2007-11-19 1.55 1.25
2007-11-20 1.55 1.25
2007-11-21 1.52 1.22
2007-11-22 1.50 1.21
2007-11-23 1.51 1.21
2007-11-26 1.52 1.25
2007-11-27 1.50 1.25
2007-11-28 1.50 1.23
2007-11-29 1.52 1.24
2007-11-30 1.56 1.25
2007-12-03 1.56 1.22
2007-12-04 1.56 1.23
我想要什么:
Date grpA grpB
2007-11-09 1.66 NA
2007-11-12 1.64 NA
2007-11-13 1.61 1.28
2007-11-14 1.60 1.30
2007-11-15 1.57 1.27
2007-11-16 1.56 1.25
2007-11-19 1.55 1.25
2007-11-20 1.55 1.25
2007-11-21 1.52 1.22
2007-11-22 1.50 1.21
2007-11-23 1.51 1.21
2007-11-26 1.52 1.25
2007-11-27 1.50 1.25
2007-11-28 1.50 1.23
2007-11-29 1.52 1.24
2007-11-30 1.56 1.25
2007-12-03 1.56 1.22
2007-12-04 1.56 1.23
数据帧的可重现样本如下:
df <- data.frame(Date = structure(c(1194307200, 1194393600, 1194566400,
1194825600, 1194912000, 1194998400, 1195084800, 1195171200, 1195430400,
1195516800, 1195603200, 1195689600, 1195776000, 1196035200, 1196121600,
1196208000, 1196294400, 1196380800, 1196640000, 1196726400), class = c("POSIXct",
"POSIXt"), tzone = "UTC"),
grpA = c(NA, NA, 1.66, 1.64, 1.61, 1.6, 1.57, 1.56, 1.55, 1.55, 1.52, 1.5, 1.51, 1.52, 1.5, 1.5, 1.52, 1.56, 1.56, 1.56),
grpB = c(NA, NA, NA, NA, 1.28, 1.3, 1.27, 1.25, 1.25, 1.25, 1.22, 1.21, 1.21, 1.25, 1.25, 1.23, 1.24, 1.25, 1.22, 1.23))
我已经尝试了 tidyr 包中的 drop_na 函数,它可以工作:
df2 <- drop_na(df, grpA)
但是,我将在 Shiny App 中使用上述过滤,并且我不会提前知道用户会选择哪些列中包含 NA 的行数最少。
我尝试了以下方法来识别其中包含 NA 的行数最少的列,但它为我提供了非 NA 行数而不是列名:
max(colSums(!is.na(df[-1])))
我尝试使用以下方法提取列名,但遇到错误:
colnames(df)[which(colSums(!is.na(df[-1]))) == max(colSums(!is.na(df[-1])))]
我认为这是一项简单的任务,但它变得相当复杂。我需要答案才能在闪亮的反应式表达式中使用。
谢谢,非常感谢!
【问题讨论】: