2015-10-26 4 views
3

Я очень смущен концепциями структуры данных в R (это гораздо проще понять в SAS).В чем разница между 1: 5 и c (1,2,3,4,5)?

Есть ли разница между x <- 1:5 и x <- c(1,2,3,4,5)? Из окна среды я знаю, что один int, а другой num.

+5

':' является функцией для создания целочисленных последовательностей. Оба вектора являются числовыми, но последний является числовым двойным. Двойное числовое, целое целое, а также числовое. Целые операции обычно делают операции быстрее. –

+1

Если вы хотите, чтобы вторая опция была целочисленной, а не числовой, вы могли бы сделать «x <- c (1L, 2L, 3L, 4L, 5L)» или 'x <- as.integer (c (1, 2, 3, 4, 5)). – cocquemas

+0

Я считаю, что sas имеет одну структуру данных, поэтому я думаю, что было бы проще – rawr

ответ

4

x и y ниже не совсем идентичны, поскольку они имеют разные режимы хранения, как вы обнаружили, используя str(x) и str(y). По моему опыту, это различие не важно в 99% случаев; R использует довольно свободную типизацию, и при необходимости целые числа будут автоматически повышаться до двойной (то есть с плавающей запятой с двойной точностью). Целые числа и значения с плавающей запятой ниже максимального целочисленного значения (.Machine$integer.max) могут быть преобразованы взад и вперед без потери информации. (Целые действительно занимают немного меньше места для хранения, и может быть немного быстрее вычислить с как @RichardScriven комментарии выше.)

Если вы хотите создать целочисленный вектор, добавьте L, как показано ниже ... или использовать as.integer() как предложено в комментариях выше.

x <- 1:5 
y <- c(1,2,3,4,5) 
z <- c(1L,2L,3L,4L,5L) 
all.equal(x,y) ## test for _practical_ equivalence: TRUE 
identical(x,y) ## FALSE 
identical(x,z) ## TRUE 

storage.mode() и class() могут также быть полезными, а также is.integer(), is.double(), as.integer(), as.double(), is.numeric() ...

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