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()
就可以了。这对我很管用。哇,我简直不敢相信。你完全正确!我已经浪费了很多时间,真不敢相信这就是问题所在哈哈-谢谢你,罗纳克!!哇,我简直不敢相信。你完全正确!我已经浪费了很多时间,真不敢相信这就是问题所在哈哈-谢谢你,罗纳克!!