использование gsub для удаления строк, но не числовых - PullRequest
0 голосов
/ 01 октября 2018

У меня есть фрейм данных, который выглядит следующим образом

 id   col1
  1     4
  2     -
  3     +
  4     _
  5     N
  6     text-abc
  7     50

Я стремлюсь иметь фрейм данных, который выглядит следующим образом:

 id   col1
  1     4
  2     0
  3     0
  4     0
  5     0
  6     0
  7     50

Я хочу сохранить числовые значения таким образом,они и конвертируют "-", "+", "_", "N" и "text-abc" в нули.То есть я бы хотел, чтобы в этом столбце были только числовые значения, преобразовывал тексты и другие строки в нули и оставлял числовые значения такими, как они есть.Это очень длинный столбец (то есть тысячи строк) и может содержать другой ненужный текст.

Чтобы исправить, я попытался сделать это вручную, используя следующее:

  df$col1 <- gsub("text-abc", 0, df$col1)
  df$col1 <- gsub("+", 0, df$col1)
  df$col1 <- gsub("-", 0, df$col1)
  df$col1 <- gsub("_", 0, df$col1)
  df$col1 <- gsub("N", 0, df$col1)

Однако, как уже упоминалось, это не практично для больших наборов данных.Поэтому я попробовал следующее:

  df$col1 <- gsub("[^[[:alnum:]]", 0, df$col1)

Но он просто изменил «text-abc» на «text0abc» вместо того, чтобы превратить все это в 0. В идеале, я хотел бы, чтобы столбец содержал толькочисловые значения.

Любая помощь будет принята с благодарностью.Заранее большое спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Мы можем использовать регулярные выражения для этого

df$col1[!grepl('^[0-9]+$', df$col1)] <- 0
df$col1 <- as.numeric(df$col1)
df
#  id col1
#1  1    4
#2  2    0
#3  3    0
#4  4    0
#5  5    0
#6  6    0
#7  7   50

data

df <- structure(list(id = 1:7, col1 = c("4", "-", "+", "_", "N", "text-abc", 
   "50")), class = "data.frame", row.names = c(NA, -7L))
0 голосов
/ 01 октября 2018

Вместо преобразования столбца в каждом конкретном случае мы можем использовать as.numeric, чтобы изменить нечисловой столбец на NA с, а затем преобразовать эти NA в 0.

df$col1 <- as.numeric(df$col1)

#Use this if `col1` is factor
#df$col1 <- as.numeric(as.character(df$col1))

df$col1[is.na(df$col1)] <- 0

df

#  id col1
#1  1    4
#2  2    0
#3  3    0
#4  4    0
#5  5    0
#6  6    0
#7  7   50
...