R:class 字符的小数部分到十进制 - 其他方法不起作用
R: fraction of class character to decimal - other approachs don't work
抱歉重复了,但出于某种原因,显示的答案 here 对我不起作用。我已经检查过,我正在使用的数据 table 具有特征性。
这是我的数据table
> 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"
如您所见,我对第二列进行了建模,以便让元素完全采用分数格式。我希望第二列为十进制格式,第一列为数字而不是字符,最后的 objective 是将两列按行相加。
当我尝试将其转换为十进制时,它对我的 dt 没有任何影响 - 自己看看
> FractionToDecimal <- function(x) {
+ eval(parse(text=as.character(x)))
+ x
+ }
> sapply(dt$V2, FractionToDecimal)
0/1 0/1 1/2 3/4
"0/1" "0/1" "1/2" "3/4"
> FractionToDecimal(dt$V2)
[1] "0/1" "0/1" "1/2" "3/4"
我用的其他方法,也没用
> dt %>% mutate(V2 = eval(parse(text = V2)))
V1 V2
1 4 0.75
2 1 0.75
3 0 0.75
4 3 0.75
它只是把错误的结果从头到尾重复一遍。
有人知道问题出在哪里吗?
如果有人也知道如何将两列都变成numeric/integer格式,那也会有帮助!!
谢谢!!
使用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
您的函数有效,但您没有在函数中更改 x
并且 return 未更改 x
。
所以 return 输出 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
和return中改变的x
。
FractionToDecimal <- function(x) {
x <- eval(parse(text=x))
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
抱歉重复了,但出于某种原因,显示的答案 here 对我不起作用。我已经检查过,我正在使用的数据 table 具有特征性。
这是我的数据table
> 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"
如您所见,我对第二列进行了建模,以便让元素完全采用分数格式。我希望第二列为十进制格式,第一列为数字而不是字符,最后的 objective 是将两列按行相加。
当我尝试将其转换为十进制时,它对我的 dt 没有任何影响 - 自己看看
> FractionToDecimal <- function(x) {
+ eval(parse(text=as.character(x)))
+ x
+ }
> sapply(dt$V2, FractionToDecimal)
0/1 0/1 1/2 3/4
"0/1" "0/1" "1/2" "3/4"
> FractionToDecimal(dt$V2)
[1] "0/1" "0/1" "1/2" "3/4"
我用的其他方法,也没用
> dt %>% mutate(V2 = eval(parse(text = V2)))
V1 V2
1 4 0.75
2 1 0.75
3 0 0.75
4 3 0.75
它只是把错误的结果从头到尾重复一遍。
有人知道问题出在哪里吗?
如果有人也知道如何将两列都变成numeric/integer格式,那也会有帮助!!
谢谢!!
使用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
您的函数有效,但您没有在函数中更改 x
并且 return 未更改 x
。
所以 return 输出 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
和return中改变的x
。
FractionToDecimal <- function(x) {
x <- eval(parse(text=x))
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