r - 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 吗?我想将所有这些值作为数字类型返回,没有额外的字符。
我很感激任何帮助。谢谢你。
解决方案
您可以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
推荐阅读
- python - 如何向 C 函数添加分析调用?
- java - Spring Cloud Stream Kinesis Binder - 并发
- javascript - 记录嵌套对象属性的 JS 函数,其中属性作为参数传递
- python - Pygame背景音乐不播放
- opencv - OpenCV4 错误:“CV_CAP_PROP_FRAME_WIDTH”未在此范围内声明
- python - 使用python生成postgresql数据库备份
- sql - 调试 SQL Server SQL
- java - Java - Python AES 加密解密
- c++ - char[](c-string) 的初始化标准
- java - 如何在Android中以编程方式下载网页的mhtml文件