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
我的目标是更改 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