我需要检测我的第一行观察是否是一行名称。导入数据时始终从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
答案 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) { ... }