我有一个带有列的数据框" 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
答案 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)