2015-02-26 3 views
0

У меня есть кадр данных с колонкой «episode_number», содержащей альфа-числовые значения. Я не хотел, чтобы только строки, содержащие только числовые значения в EPISODE_NUMBER - не буквенно-цифровой/пунктуации и т.д.is.numeric vs. is.integer vs. is.wholenumber - какая разница?

Я использовал это сохранить только числовые строки:

df <- df[!(grepl("[a-zA-Z]", df$episode_number)), ] df <- df[!(grepl("[[:punct:]]", df$episode_number)), ]

Далее, я хотел бы преобразовать class столбца от символа к цифровому. В первом я попробовал:

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

получил ошибку: Error: (list) object cannot be coerced to type 'double'

Тогда я сделал:

as.numeric(as.character(df$episode_number)) и она работала.

Не уверен, действительно ли все значения были числовыми, я попытался проверить с помощью: is.integer(df$episode_number).

У меня [1] FALSE.

Будучи очень озабоченным сейчас, я попытался проверить, проходит ли он все числовое испытание - это было! Нет никаких исключений между положительными целыми числами & целые числа - я в замешательстве! Как ни странно - при вводе этого, он также ударил меня сделать:

as.integer(as.character(df$episode_number))

is.integer(df$episode_number)

угадайте что? [1] TRUE

Вот мои данные образца. Может ли кто-нибудь объяснить эту причуду R? 1) Почему двойная ошибка типа? 2) Почему целое число не является положительным целым? 3) Почему as.numeric не работает и as.numeric(as.character(x)) работать?

> df material_type material material.1 content_identifier_description episode_number 1 ZOR3 30022517 10002178 Episode 2A 2 ZOR3 30022518 10002178 Episode 2B 3 ZOR3 30022519 10002178 Episode 3A 4 ZOR3 30022520 10002178 Episode 3B 5 ZOR3 30022521 10002178 Episode 4A 6 ZOR3 30022522 10002514 Episode 101 7 ZOR3 30022523 10002178 Episode 4B 8 ZOR3 30022544 10004726 Episode 201 9 ZOR3 30022545 10004726 Episode 202 10 ZOR3 30022546 10004726 Episode 203

+0

Показать выход из 'str (df)', желательно, прежде чем вы начнете его обрабатывать. – joran

+0

предупреждение и детали под «фактором» могут ответить на некоторые из этих вопросов. is.wholenumber не является базовой функцией r – rawr

+3

Также обратите внимание на то, что он задокументирован в 'help (is.integer)' '' 'is.integer (x)' не должен использоваться для проверки того, что 'x' содержит целочисленные значения. 'typeof()' скажет правду. –

ответ

1

Я не совсем уверен, если я думаю, что в простой, но я дам ему попробовать.

Сначала: Как вы определили свою функцию is.wholenumber или откуда вы ее взяли? Кажется, это не стандартная функция R.

На вопрос 2 (Почему целое число не целое положительное число?): С целое число вы имеете в виду, что значение переменной выглядит как целое число? Таким образом, вы не говорите о типе данных, а о значении? Вы должны различать оба, как показано в следующем примере.

# define two variable 
a = 3 
b = as.integer(3) 
# test if the variables are integers 
is.integer(a) 
is.integer(b) 
# test which data type the variables have 
storage.mode(a) 
storage.mode(b) 

В этом примере переменная и б оба принимают значение 3, который представляет собой целое число. Тип данных a не является целым числом, а b является.Общий тип данных для переменных, содержащих числа, - числовые. Если вы хотите, чтобы ваша переменная была целым числом, вы должны ее явно объявить.

К вопросу 1 (Почему ошибка двойного типа?): Пожалуйста, попробуйте упорядочить ваши данные немного понятнее или дать более короткий пример в следующий раз.

# define a data frame 
f1 = data.frame(array(1:12, dim = c(3,4))) 
# convert the last column into a double array 
d1 = as.numeric(f1$X4) 
# works fine! 

# now we modify one element 
f1[2,4] = '2A' 
# and remove it 
f2 = f1[!grepl('A',f1$X4), ] 
# convert the remaining data into a double array 
d2 = as.numeric(f2$X4) 
# works also fine 
# also this 
f2$X4 <- as.numeric(f2$X4) 
# works fine 

# The error message can only be reproduced if you write 
as.numeric(f2) 

Таким образом, вы уверены, что вы написали это?

df$episode_number <- as.numeric(df$episode_number) 
+1

'd1 = as.numeric (f1)' фактически возвращает ошибку. Также см. Мой комментарий выше об использовании 'is.integer()' для проверки целочисленного типа. Вы также не должны использовать 'storage.mode()', а скорее 'typeof (x)' для возврата типа данных 'x' –

+0

Спасибо за замечания. Я не знал о различии между 'storage.mode()' и 'typeof()'. 'as.numeric (f1)' был опечаткой. Я исправил это. –

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