检测包含名称的行
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) { ... }
我需要检测我的第一行观察是否是一行姓名。当我导入数据时,总是从电子表格中导入为字符列(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) { ... }