Удалить строки из data.frame из непрерывных данных, содержащих символы - PullRequest
0 голосов
/ 31 мая 2018

У меня есть data.frame со столбцом, который должен иметь непрерывные данные.Однако некоторые строки имеют значения с символами «~» и «<». </p>

c.a <- c(1,5,3,7,4,9,2,3,7)
c.b <- c("a", "c", "f", "s", "r", "q", "w", "e", "t")
c.d <- c(1,4,6, '<5', '~34', 65, 45, 2, 6)
x <- data.frame(c.a, c.b, c.d)

Цель состоит в том, чтобы удалить строки 4 и 5 из data.frame x

Надеемсяэто не повторяющийся вопрос, но я сделал быстрый поиск и не могу найти решение.Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

Преобразовать коэффициент в числовое значение (as.numeric(levels(x[, 'c.d']))[x[, 'c.d']]), а затем индексировать NA вне фрейма данных:

x <- x[!is.na(as.numeric(levels(x[, 'c.d']))[x[, 'c.d']]), ]

. Выдает предупреждающее сообщение ( warnings≠ ошибки ), которые вы можете игнорировать (это объясняется тем, что преобразование нецифровых символов приводит к созданию NA, но это именно то, что мы хотим, чтобы это было здесь).

Warning message:
In `[.data.frame`(x, !is.na(as.numeric(levels(x[, "c.d"]))[x[, "c.d"]]),  :
  NAs introduced by coercion

И это результат,как вы и просите:

  c.a c.b c.d
1   1   a   1
2   5   c   4
3   3   f   6
6   9   q  65
7   2   w  45
8   3   e   2
9   7   t   6
0 голосов
/ 31 мая 2018

Вы можете использовать grepl() для фильтрации:

x[grepl(x=as.numeric(x$c.d),"[^\\d]"), ]

Вывод:

  c.a c.b c.d
1   1   a   1
2   5   c   4
3   3   f   6
4   9   q  65
5   2   w  45
6   3   e   2
7   7   t   6
0 голосов
/ 31 мая 2018

Я думаю, что если вы не выключили stringsAsFactors = F, вы можете не получить желаемых результатов. Это можно сделать при создании фрейма данных:

x <- data.frame(c.a, c.b, c.d, stringsAsFactors=F)
x$c.d <- as.numeric(x$c.d)
x[complete.cases(x),]

Вы также можете сделать options(stringsAsFactors=F) вверхувашего кода, это поможет вам во многих ситуациях (вы можете использовать его, если вам это удобно).

Выполнение вышеуказанного должно дать вам желаемый результат.

Вы можете использовать это решение(Спасибо @Onyambu):

na.omit(transform(x,c.d=as.numeric(c.d))) 
0 голосов
/ 31 мая 2018

Вы можете попробовать преобразовать в числовые и отбросить те, которые не являются числовыми

x[!is.na(as.numeric(as.character(x$c.d))),]

вывод:

  c.a c.b c.d
1   1   a   1
2   5   c   4
3   3   f   6
6   9   q  65
7   2   w  45
8   3   e   2
9   7   t   6
...