is.numeric vs. is.integer vs. is.wholenumber - 有什么区别?

时间:2015-02-26 23:31:31

标签: r class numbers dataframe

我有一个带有列的数据框" episode_number"包含字母数字值。我想只保留episode_number中只包含数值的行 - 没有字母数字/标点符号等。

我用过这个只保留数字行:

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

1 个答案:

答案 0 :(得分: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)

在此示例中,变量 a b 都取值3,这是一个整数。 a 的数据类型不是整数,而 b 的数据类型是。包含数字的变量的公共数据类型是 numeric 。如果您希望变量是一个整数,则必须明确声明它。

问题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)