2016-11-04 2 views
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 
+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', а затем вызывает ее из основной программы, предупреждения не появляются без suppreses, которые содержат другие предупреждения? –

Смежные вопросы