Существует ли команда R, чтобы выяснить, можно ли преобразовать значения данных в формате цифр c? - PullRequest
2 голосов
/ 24 января 2020

Есть ли способ в R выяснить, можно ли преобразовать значение в числовой формат c или нет? Я обычно делаю type.convert(as.is=T), чтобы преобразовать мои столбцы в цифры c и выполнять математические функции. Но в моей текущей таблице есть некоторые значения, которые невозможно преобразовать. Я хотел бы вытащить те строки без NA, которые не включают числовые c конвертируемые символы в столбцах, которые заканчиваются на «a».

DATA

df <- data.frame(names=c("Shawn", "James", "Caleb", "David"), a_a=c("1",NA,"bad","1"),a_b=c("1",NA,"1","good"))
names   a_a  a_b
1 Shawn   1    1
2 James <NA> <NA>
3 Caleb bad    1
4 David   1 good
df %>%
 filter_at(vars(ends_with("a")), any_vars(!is.na(.) & class(.) != "character")

ЖЕЛАЕМЫЙ ВЫХОД

names   a_a  a_b
Caleb   bad    1

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Есть несколько опций,

1) Для преобразования в numeric, а затем автоматически не-NA элементы преобразуются в NA, который мы можем захватить с помощью is.na

library(dplyr)
df %>% 
     type.convert(as.is = TRUE) %>%
     filter_at(vars(ends_with('a')), any_vars(is.na(as.numeric(.)) & !is.na(.)))
#   names a_a a_b
#1 Caleb bad   1

Выше было бы предупреждение при преобразовании в numeric, когда присутствуют «символьные» элементы


2) Используйте детектор регулярных выражений

library(dplyr)
library(stringr)
df %>% 
     filter_at(vars(ends_with('a')), 
          any_vars(str_detect(., '[A-Za-z]') &  class(.) != "character"))
#   names a_a a_b
#1 Caleb bad   1
1 голос
/ 24 января 2020

Потенциально в базе R:

# drop the 'irrelevant' rows - ie the ones with NAs upfront
df2 <- df[!is.na(df[, grep("_a$", names(df))]), ]
# then identify the ones where as.numeric would result in NA
res <- df2[is.na(as.numeric(df2[, grep("_a$", names(df2))])), ]

Результат:

names a_a a_b   
Caleb bad   1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...