包括数据框中必需的列

  • 本文关键字:数据 包括 r
  • 更新时间 :
  • 英文 :


我在下面有一个数据帧。

asd <- data.frame(a=c(1:10),b=c(11,20),c=(21:30),d=c(31:40),e=c(41,50),f=c(51,60))

以下是包含 asd 列名称的 2 个向量

Column_list1 <- c("a","b","d")
Column_list2 <- c("c","e","f")

以下是必填列列表

mandatory_column <- c("a","b","d","e")

现在实际上我的问题是当我尝试运行asd[Column_list1]时,结果应该抛出一条消息。因为必填列应该c("a","b","d","e"),而且Column_list1没有"e",我需要打印消息,"请包括"e"列"。这是有可能实现的吗?

预期产出

asd[Column_list1]
Please include column "e" as well
asd[mandatory_column]
a  b  d  e
1   1 11 31 41
2   2 20 32 50
3   3 11 33 41
4   4 20 34 50
5   5 11 35 41
6   6 20 36 50
7   7 11 37 41
8   8 20 38 50
9   9 11 39 41
10 10 20 40 50

如果你想弄乱你的对象asd的类,就会想到一个S3方法。

`[.special` <- function(x, i, ..., mandatory = mandatory_column){
on.exit({
cols_missing <- setdiff(mandatory, i)
if(length(cols_missing) > 0){
msg <- paste(sQuote(cols_missing), collapse = ", ")
msg <- paste("Please include columns", msg)
warning(msg)
}
})
NextMethod(x, i, ...)
}

Column_list1 <- c("a","b","d")
Column_list2 <- c("c","e","f")
mandatory_column <- c("a","b","d","e")

第一次调用仍调用[.data.frame方法。

asd[Column_list1]

现在调用[.special方法。它对数据进行子集化并发出警告。

class(asd) <- c("special", class(asd))
asd[Column_list1]
asd[Column_list2]
asd[mandatory_column]
mandatory_columns <- c("cyl", "disp", "gear", "quux")
stopifnot(all(mandatory_columns %in% colnames(mtcars)))
# Error: all(mandatory_columns %in% colnames(mtcars)) is not TRUE

或者:

missingfields <- setdiff(mandatory_columns, colnames(mtcars))
if (length(missingfields)) {
stop("missing fields: ", paste(sQuote(missingfields), collapse = ", "))
}
# Error: missing fields: 'quux'

### with a subset of mtcars, demonstrating more missing columns:
missingfields <- setdiff(mandatory_columns, colnames(mtcars)[1:4])
if (length(missingfields)) {
stop("missing fields: ", paste(sQuote(missingfields), collapse = ", "))
}
# Error: missing fields: 'gear', 'quux'

如果您使用的是shiny并希望在不停止程序的情况下进行验证/消息,请使用validateneedreq

output$my_table <- renderTable({
validate(need(req(all(mandatory_columns %in% names(mtcars))), "Missing columns"))
asd[,mandatory_columns]
})

最新更新