如何在向量中区分整数和小数?

3

我使用data.table包中的fread函数从数据框中读取了一列。向量中约有一半的数字具有双精度,而另一半只具有整数精度。

head(data$value)
#[1] 3 1.2 3.1 1 1.0 5

我希望将向量按精度分为两部分,但是当我使用 typeof 函数时,所有值都以 double 的形式返回,所以我无法使用该函数来区分这两个部分。
输出将会得到两个单独的向量,如下所示:
single <- c(3,1,5)
double <- c(1.2,3.1,1.0)

2
请问您可否展示期望的输出结果? - Sotos
它是一个整数,但精度是双精度,因此我想将其分成双精度组。 - Michael Flatebo
3
如果变量是double类型,为什么有些值是1而有些是1.0?我是否遗漏了什么?请提供一个可重现的例子(dput(head(data$value)))。 - Sotos
4
“它是整数,但具有双精度”这句话没有意义。请说明1.0与1有何不同,以及为什么在打印“data$value”时,有些数字显示为整数格式,而其他数字显示为浮点格式,因为R通常会使用相同格式打印所有数字……这句话的意思不够清晰。请说明1.0与1的区别。同时解释为什么在打印 data$value 时,有些数字显示为整数格式,而其他数字显示为浮点格式,因为 R 通常会使用相同格式打印所有数字。请注意不要添加额外的解释或信息。 - digEmAll
1
也许该列中的值来自两种不同类型的测量:其中一些是粗略的(-->整数精度),而另一些则使用允许更高精度的设备进行测量(-->双精度)。OP需要将它们区分开。因此,一个合理的解决方案可能是使用freadcolClasses参数将它们读取为字符,然后使用@ytu的方法。 - Scarabee
3个回答

5
假设您的向量为x,您可以按与原始值相同的四舍五入值进行拆分,例如:
x <- c(3, 1.2, 3.1, 1, 1.0, 5)

split(x, round(x) == x)

$`FALSE`
[1] 1.2 3.1

$`TRUE`
[1] 3 1 1 5

2
我认为在这里不应该把1.0看作是1。在这种情况下它们是不同的。 - ytu
1
我很感激,但是相比于1,1.0具有双精度。因此,我想要将它们区分开来。 - Michael Flatebo

2
为了区分1.0和1,我想到了一个方法(可能不太高明):使用正则表达式将它们分开。
single <- data$value[!grepl("\\.", data$value)]
double <- data$value[grepl("\\.", data$value)]

在这种情况下,data$value首先在grepl中被强制转换为字符,然后逐个搜索字面点,生成逻辑值以对data$value进行子集筛选。

你甚至可以使用 fread("file.csv", colClasses = c(value = "character")) 直接将值作为字符读取。 - Scarabee
一样的情况。运行您的方法来拆分这个向量 x <- c(3, 1.2, 3.1, 1, 1.0, 5) - Sotos

1
尝试像这样做:

single<-data[grepl("[.]",data$value),"value"]
double<-data[!grepl("[.]",data$value),"value"]

single
[1] 1.2 3.1 1.0
Levels: 1 1.0 1.2 3 3.1 5
> double
[1] 3 1 5
Levels: 1 1.0 1.2 3 3.1 5

我明白你的意思,但在问题中head(data$value)#[1] 3 1.2 3.1 1 1.0 5中,出现了相同值的字符格式,有些带小数点,有些不带。(例如1和1.0) - Terru_theTerror
我认为这个问题不是很清楚。 - Terru_theTerror
那肯定是这样的... - Sotos
1
我的代码只有在这种情况下才能正常工作:data<-data.frame(value=c("3", "1.2", "3.1", "1", "1.0", "5"))。 - Terru_theTerror
让我们在聊天中继续这个讨论 - Terru_theTerror
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接