R ifelse 改变整个数据帧的值格式

R ifelse to alter value format over entire data frame

我的目标是更改 df 中值的格式。

df 大约有 1500 列。有多种格式不可用,即英尺和英寸、$ 符号、+ & - 前缀、逗号等。

EX:

 x         y        z        q
+25.00    75'6"    1,000    ,500,000
-10.00    67'10"   5,000    0,000
+09.11    72'3"    1,500    0,000
+01.37    65'9"    27,000   ,000,000


我在尝试为此编写代码时失败了。我需要一个格式函数和一个 do 循环到 df 上的 运行 吗?我想 return 所有这些值都作为数字类型,没有额外的字符。

感谢任何帮助。 谢谢。

您可以 gsub 不是数字的所有内容(使用 [:digit:],并添加句号和减号以保留它)并用任何内容替换它。通过 as.numeric 传递并将其全部放入 sapply 以将其作为矩阵返回:

sapply(data, function(x) as.numeric(gsub("[^[:digit:].-]","",x)))
          x    y     z       q
[1,]  25.00  756  1000 1500000
[2,] -10.00 6710  5000  300000
[3,]   9.11  723  1500  500000
[4,]   1.37  659 27000 3000000

(如果你只是做 gsub,没有 sapply,你会把每一行作为一个数字字符串返回。可能有更好的方法来避免这种情况,但我不确定它是什么是。)

根据 Gregor 的建议,这是此解决方案的一个变体,我将英尺英寸格式替换为小数点以提高可读性:

sapply(data, function(x) {x<-gsub("'(\d*)''",".\1",x)
     as.numeric(gsub("[^[:digit:].-]","",x))})
          x    y     z       q
[1,]  25.00 75.6  1000 1500000
[2,] -10.00 67.1  5000  300000
[3,]   9.11 72.3  1500  500000
[4,]   1.37 65.9 27000 3000000

(请注意,在我的数据中,英寸符号已替换为 ''(两个撇号)——您需要将其替换为您的数据中的任何内容。)

最后一个选项,我将英尺和英寸更改为厘米,使其成为十进制:

sapply(data, function(x) {
           if(any(grepl("'",x))) {inches<-strsplit(x,split="\'")
             x<-unlist(lapply(inch, function(y) as.numeric(y[1])*30.48+as.numeric(y[2])*2.54))
             x}
         as.numeric(gsub("[^[:digit:].-]","",x))
        }
       )

          x       y     z       q
[1,]  25.00 2301.24  1000 1500000
[2,] -10.00 2067.56  5000  300000
[3,]   9.11 2202.18  1500  500000
[4,]   1.37 2004.06 27000 3000000