循环将十进制逗号(,)转换为点(。)以更改data.frame列的类

时间:2013-12-27 15:14:48

标签: regex r

我想将小数点逗号,转换为点.。 由于我没有使用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"

3 个答案:

答案 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