0

我需要检测我的第一行观察结果是否是一行名称。当我导入数据时,总是从电子表格(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")

所以,在这个逻辑中,我使用隐式强制来完成我的任务。从最初是数字类元素的字符元素开始,强制转换很简单。但是对于最初是文本字符串的元素,隐式强制转换失败并抛出 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
4

1 回答 1

3

测试用例:

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()不幸的是,抑制所有警告,据我所知,没有简单的方法来过滤特定警告:R 中的警告没有关联的唯一代码,警告文本可能会翻译成其他语言......)。例如,如果由于某种疯狂的原因你最终row被设置为一个复数,例如sum(!is.na(as.numeric(2+3i)))会给出警告“在强制中丢弃的虚构部分”,但即使你可能想看到它,这个警告也会被抑制。

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

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

这假设“数字”是指“整数”。如果要检测浮点数,则需要不同/更复杂的正则表达式。

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

于 2016-11-04T18:49:37.880 回答