1

我从 CSV 文件中导入了一个带有奇怪格式数字数据的大型数据框。这是我正在使用的数据框的可重现示例:

df <- data.frame("r1" = c(1,2,3,4,5), "r2" = c(1,2.01,-3,"-","2,000"))

'r2' 包含带负号的值,例如“-”,以及用破折号“-”表示的零值。要对这个凌乱的 r2 列进行一些数值分析,我需要:

  1. 将“-”替换为零“0”,同时避免删除负值前面的负号。
  2. 避免对 NA 强制使用“2,000”等合法值。出于某种原因,当我运行命令时:foo$row2<- as.numeric(sub("-",0,foo$row2))R 将用逗号格式化的值强制转换为 NA,从而损坏列中的数据。

这是运行后的输出示例foo$row2<- as.numeric(sub("-",0,foo$row2))

Warning message:
NAs introduced by coercion 
  r1   r2
1 1  1.00
2 2  2.01
3 3  3.00
4 4  0.00
5 5   NA

如您所见,“2,000”被强制转换为 NA。-3 被错误地转换为 3(删除了破折号)。但是,嘿,至少我们去掉了第 3 行中的“-”,对吧!!!

以下是我最终想要制作的内容:

 r1   r2
1 1  1.00
2 2  2.01
3 3  -3.00
4 4  0.00
5 5  2000

请注意,第 5 行的逗号已删除。列 r2 应该被格式化,以便我可以sum(df$r2)在上面运行类似的命令。

4

2 回答 2

5

你的方法是合理的。只需运行两次替换,一次删除只是破折号的任何内容,再一次删除任何逗号。

df$r2<-as.numeric(gsub('^-$','0',gsub(',','',df$r2)))

而且,如果您不熟悉正则表达式,^-$我的意思是只删除以 ( ^)、破折号和结尾 ( $) 开头的字符串。

于 2013-10-18T02:27:55.220 回答
1

nograpes 的解决方案更酷:

## df <- data.frame("r1" = c(1,2,3,4,5), "r2" = c(1,2.01,-3,"-","2,000"))

df$r2 <- as.numeric(gsub(",", "", df$r2))
df$r2[is.na(df$r2)] <- 0

##   r1      r2
## 1  1    1.00
## 2  2    2.01
## 3  3   -3.00
## 4  4    0.00
## 5  5 2000.00
于 2013-10-18T02:30:56.787 回答