2016-10-05 1 views
1

Мой кадр данных DF выглядит следующим образом:в R: удалить строки, не содержащие целое число (например, символы Ie) из кадра данных

Variable A Variable B Variable C 
9   2   1 
2   0   don't know 
maybe  1   1 
?   0   3 

Мне нужно удалить все строки, где используются не-числовые значения , Он должен выглядеть так далее:

Variable A Variable B Variable C 
9   2   1 

Я думал о чем-то вроде

df[! grepl(*!= numerical*, df),] 

или

df[! df %in% *!= numerical*, ] 

, но я не нашел ничего, что я мог бы использовать в качестве входных данных для «принимать все который не соответствует числовым значениям ". Не могли бы вы мне помочь? Спасибо большое!

ответ

3

Одним из вариантов было бы петлю через колонки, преобразовывать в numeric так, что все не-числовые элементы преобразовать в НС, проверить НС с is.na, отрицают (!) она, сравнить соответствующие элементы list с Reduce и & , используйте это для подмножества строк.

df[Reduce(`&`, lapply(df, function(x) !is.na(as.numeric(x)))),] 
+0

Я думал: 'df [] = sapply (df, as.numeric)', а затем 'na.exclude (df)' - имеет ли недостатки по сравнению с вашим подходом 'Reduce'? – jakub

+0

@jakub, единственный недостаток, который я вижу вашему подходу, - это вернуть объект 'matrix' вместо' data.frame'. – Benjamin

+0

спасибо! Это работает :) – user6925545

0

Возможно, это не лучший способ сделать это, но работает.

s является ФР, который содержит ваш DATA-

contains <- lapply(seq_len(nrow(s)), function(i){ 
    yes <- grep("[^0-9.]" , s[i,]) #regex for presence of non-digits 
    ifelse(identical(yes, integer(0)),F,T) 
}) %>% unlist 


s <- s[which(!contains),] 

Спасибо!

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