2016-11-04 56 views
0

我需要檢測我的第一行觀察是否是一行名稱。始終當我導入數據時,從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

請出示一個小重複的例子,並且預期輸出 – akrun

+0

@BenBolker你的答案是非常有幫助!是的,8列的數字總是整數。 –

回答

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) { ... }

+0

我試圖使用正則表達式作爲匹配名稱中的不同方法,但沒有向我申請條件本身。 –

+0

雖然感受到了這種情緒,但StackOverflow棄用了[使用註釋來說「謝謝」](http://meta.stackoverflow.com/questions/258004/should-thank-you-comments-be-flagged?lq=1) ;如果這個答案很有用,你可以放棄它(如果你有足夠的聲望),並且在任何情況下,如果它滿意地回答你的問題,我們鼓勵你點擊複選標記來接受它。 –

+0

複製該內容;在'suppressWarnings'的情況下,如果引發警告的函數與主「程序」分離,封裝'suppressWarnings',然後從主程序中調用它,警告沒有出現,但沒有可能出現其他警告? –