首页 > 解决方案 > R ifelse 更改整个数据帧的值格式

问题描述

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

df 有大约 1500 列。有多种格式无法使用,例如英尺和英寸、$ 符号、+ & - 前缀、逗号等。

前任:

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


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

我很感激任何帮助。谢谢你。

标签: rdataframeformattingformatdo-loops

解决方案


您可以gsub使用非数字的所有内容(使用[:digit:], 并添加句点和减号来保留它)并将其替换为空。将其通过 aas.numeric并将其全部放入 asapply以将其作为矩阵返回:

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

推荐阅读