R:类字符到小数的分数-其他方法不';行不通

R:类字符到小数的分数-其他方法不';行不通,r,datatable,fractions,decimalformat,R,Datatable,Fractions,Decimalformat,很抱歉重复,但由于某些原因,显示的答案不适用于我。我已经检查过了,我正在使用的数据表是字符性质的 这是我的数据表 > dt <- data.table(V1 = c("4", "1", "0", "3"), V2 = c("0/1", "0/1", "1/2", "3/4")) > dt V1 V2 1: 4 0/1 2: 1 0/1 3: 0 1/2 4: 3 3/4 > class(dt) [1] "data.table" "data.frame"

很抱歉重复,但由于某些原因,显示的答案不适用于我。我已经检查过了,我正在使用的数据表是字符性质的

这是我的数据表

> dt <- data.table(V1 = c("4", "1", "0", "3"), V2 = c("0/1", "0/1", "1/2", "3/4"))

> dt
   V1  V2
1:  4 0/1
2:  1 0/1
3:  0 1/2
4:  3 3/4

> class(dt)
[1] "data.table" "data.frame"
> class(dt$V2)
[1] "character"
它只是重复错误的结果

有人知道问题出在哪里吗

如果有人也知道如何将这两列转换成数字/整数格式,这也会有帮助


谢谢

使用
sapply

dt$V2 <- sapply(dt$V2, function(x) eval(parse(text=x)))
dt
#   V1   V2
# 1  4 0.00
# 2  1 0.00
# 3  0 0.50
# 4  3 0.75

dt$V2使用
sapply

dt$V2 <- sapply(dt$V2, function(x) eval(parse(text=x)))
dt
#   V1   V2
# 1  4 0.00
# 2  1 0.00
# 3  0 0.50
# 4  3 0.75

dt$V2您的函数可以工作,但您没有更改函数中的
x
,也没有返回未更改的
x

因此,要么直接返回
eval
+
parse
的输出

FractionToDecimal <- function(x) eval(parse(text=x))
sapply(dt$V2, FractionToDecimal, USE.NAMES = FALSE)
#[1] 0.00 0.00 0.50 0.75

您的函数可以工作,但您没有更改函数中的
x
,也没有返回未更改的
x

因此,要么直接返回
eval
+
parse
的输出

FractionToDecimal <- function(x) eval(parse(text=x))
sapply(dt$V2, FractionToDecimal, USE.NAMES = FALSE)
#[1] 0.00 0.00 0.50 0.75

另一个选项是使用
tstrsplit
进行拆分并拆分

library(data.table)
dt[, do.call(`/`, tstrsplit(V2, "/", type.convert =TRUE))]
#[1] 0.00 0.00 0.50 0.75

另一个选项是使用
tstrsplit
进行拆分并拆分

library(data.table)
dt[, do.call(`/`, tstrsplit(V2, "/", type.convert =TRUE))]
#[1] 0.00 0.00 0.50 0.75

谢谢你,jay.sf-它很有效!但我不明白,为什么直接应用它有效,而使用函数无效?它不是应该是一样的吗?我不是100%确定,但是
parse
逐行读取向量,这可能是它的最后一行被
eval
评估的原因。与非矢量化类似,因此
sapply
。谢谢你,jay.sf-它很有效!但我不明白,为什么直接应用它有效,而使用函数无效?它不是应该是一样的吗?我不是100%确定,但是
parse
逐行读取向量,这可能是它的最后一行被
eval
评估的原因。与非矢量化类似,因此
sapply
。问题源于如何定义
FractionToDecimal()
x
是多余的。我认为可能是这样的,所以我也尝试了没有,但仍然不起作用。。谢谢你的提示,我总是在最后打印结果-从现在开始会改变这一点,我的意思是只需删除
FractionToDecimal()
最后一行的
x
,然后
sapply()
就可以了。这对我来说很有效。问题源于您如何定义
FractionToDecimal()
x
是多余的。我认为可能是这样的,所以我也尝试了没有,但仍然不起作用。。谢谢你的提示,我总是在最后打印结果-从现在开始会改变这一点,我的意思是只需删除
FractionToDecimal()
最后一行的
x
,然后
sapply()
就可以了。这对我很管用。哇,我简直不敢相信。你完全正确!我已经浪费了很多时间,真不敢相信这就是问题所在哈哈-谢谢你,罗纳克!!哇,我简直不敢相信。你完全正确!我已经浪费了很多时间,真不敢相信这就是问题所在哈哈-谢谢你,罗纳克!!