检测包含名称的行

Detect a row that contain names

我需要检测我的第一行观察是否是一行姓名。当我导入数据时,总是从电子表格中导入为字符列(readxl 包)。

根据数据结构,一个非名称行,总是至少包含8个数值。

rowNoName <- c("23-234", "Bank of Wisdom", 1:8)
rowName <- c("code of acc", "name of acc", "ac", "li", "ui", "op", "o", "p", " e", "i")

所以,在这个逻辑中,我使用隐式强制转换来完成我的任务。从最初是数字 class 元素的字符元素开始,强制转换很简单。但是对于最初是文本字符串的元素,隐式强制转换失败并抛出 NA。规则是:

testName <- function(row) {
if (sum(!is.na(as.numeric(row))) >= 8) {
  print("row without names")
} else {
  print("row with names")
}

这个函数解决了这个问题,但是还有另一种更正式的方法吗? 我的意思是,避免在输出中出现强制转换 的警告消息。

> testName(row)
[1] "row with names"
Warning message:
In testName(row) : NAs introduced by coercion

测试用例:

rowNoName <- c("23-234", "Bank of Wisdom", 1:8)
rowName <- c("code of acc", "name of acc", 
   "ac", "li", "ui", "op", "o", "p", " e", "i")

你的方法:

testName0 <- function(row) {
   sum(!is.na(as.numeric(row)))>=8
}
testName0(rowNoName)
testName0(rowName)

最简单的方法是简单地将条件包装在suppressWarnings():

testName1 <- function(row) {
   suppressWarnings(sum(!is.na(as.numeric(row)))>=8)
}
testName1(rowNoName) 
testName1(rowName)

suppressWarnings() 抑制 all 警告,不幸的是,据我所知,没有 simple 过滤方法一个特定的警告:R 中的警告没有关联的唯一代码,并且警告文本可能会被翻译成其他语言......)。例如,如果出于某种疯狂的原因,您最终将 row 设置为一个复数,例如sum(!is.na(as.numeric(2+3i))) 会给出警告 "imaginary parts discarded in coercion",但即使您可能希望看到它,该警告也会被抑制。

因此,另一种更具体地检测您感兴趣的方法是:

testName2 <- function(row) {
  sum(grepl("^[0-9]+$",row)) >=8
}
testName2(rowNoName)
testName2(rowName)

这假设 "numbers" 你的意思是 "integers"。如果要检测浮点数,则需要 different/more 复杂的正则表达式。

更一般地说,您可能希望将这些函数编写为 testNamex <- function(row,min_nums=8) { ... }