检测包含名称的行

时间:2016-11-04 18:33:47

标签: r coercion readxl

我需要检测我的第一行观察是否是一行名称。导入数据时始终从spreasheet导入为字符列( 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

1 个答案:

答案 0 :(得分: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)))会在强制&#34;中放弃警告&#34;虚部,但即使你可能想看到它,这个警告也会被抑制。

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

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

这取决于&#34;数字&#34;你的意思是&#34;整数&#34;。如果要检测浮点数,则需要使用不同/更复杂的正则表达式。

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