我想将小数点逗号,
转换为点.
。
由于我没有使用read.table
导入数据,因此我无法从源中更改它。
我实际上正在使用带RODBC
包的查询来导入。
而数据库(Teradata)只输出这种小数。
特别是对于这种情况,我不知何故被迫使用正则表达式修改数据。
重点是,将对象转换为数字。
df <- data.frame(x1 = c("0,1012312", "0,165749", "0,12412", "0,6248223"),
x2 = c("0,012312","0,5749", "0,112", "0,223"),
x1 = c("0,312", "0,65749", "0,2", "0,8223"),
x2 = c("0,2312","0,49", "0,54412", "0,623")
, stringsAsFactors = FALSE)
df
str(df)
### What i've tried
尝试1
for(i in 1:4){
gsub(",", ".", df[ , i])
}
df
尝试2
inx = 1:4
fc <- function(x, inx){
nm <- names(x)[inx]
gsub(pattern = ",", replacement = ".", x = x[nm])
}
sapply(df, fc, c(df, inx))
两者都不起作用,但是如果我单独更改每列,它就可以工作。
i <- 1
gsub(",", ".", df[ , i])}
[1] "0.1012312" "0.165749" "0.12412" "0.6248223"
答案 0 :(得分:5)
尝试1 :gsub
不会修改字符串 - 您需要将其分配回df[,i]
。
df[,i] <- gsub(",", ".", df[ , i])
尝试2 :正确的主意。但x[nm]
为您提供了数据框,而gsub
则为向量。最好使用可选x[,nm]
drop = TRUE
(这是默认设置)。此外,你有你的功能的参数移动。您希望fc
应用inx
的不同值,并保持x = df
不变。
尝试:
inx = 1:4
fc <- function(x, inx){
nm <- names(x)[inx]
gsub(pattern = ",", replacement = ".", x = x[,nm])
}
sapply(inx, fc, x = df)
这会返回一个矩阵,因为sapply
会尝试简化。如果不需要,请使用lapply
并将其包装在数据框中。
data.frame(lapply(inx, fc, x = df))
或者使用匿名函数在一行中执行此操作。数据框基本上是列表,因此您可以使用lapply
来迭代列。
data.frame(lapply(df, function(x) gsub(",", ".", x, fixed = TRUE)))
答案 1 :(得分:4)
您需要指定循环的结果:
for(i in 1:4){
df[ , i] <- as.numeric(gsub(",", ".", df[ , i]))
}
df
str(df)
您还可以使用lapply
执行'循环':
df[] <- lapply(df, function(x) as.numeric(gsub(",", ".", x)))
答案 2 :(得分:3)
您可以使用plyr
包
df <- data.frame(x1 = c("0,1012312", "0,165749", "0,12412", "0,6248223"),
x2 = c("0,012312","0,5749", "0,112", "0,223"),
x3 = c("0,312", "0,65749", "0,2", "0,8223"),
x4 = c("0,2312","0,49", "0,54412", "0,623")
, stringsAsFactors = FALSE)
str(df)
## 'data.frame': 4 obs. of 4 variables:
## $ x1: chr "0,1012312" "0,165749" "0,12412" "0,6248223"
## $ x2: chr "0,012312" "0,5749" "0,112" "0,223"
## $ x3: chr "0,312" "0,65749" "0,2" "0,8223"
## $ x4: chr "0,2312" "0,49" "0,54412" "0,623"
require(plyr)
correct_decim <- function(x)
as.numeric(gsub(",", ".", x, fixed = TRUE))
new_df <- colwise(correct_decim)(df)
str(new_df)
## 'data.frame': 4 obs. of 4 variables:
## $ x1: num 0.101 0.166 0.124 0.625
## $ x2: num 0.0123 0.5749 0.112 0.223
## $ x3: num 0.312 0.657 0.2 0.822
## $ x4: num 0.231 0.49 0.544 0.623
如果出于某种原因你想要坚持使用基础R,请尝试:
data.frame(do.call(cbind, lapply(df, correct_decim)))
## x1 x2 x3 x4
## 1 0.10123 0.012312 0.31200 0.23120
## 2 0.16575 0.574900 0.65749 0.49000
## 3 0.12412 0.112000 0.20000 0.54412
## 4 0.62482 0.223000 0.82230 0.62300