在R中重新格式化杂乱数据帧列

时间:2013-10-18 02:16:47

标签: r

我从CSV文件导入了一个包含奇怪格式数字数据的大数据帧。这是我正在使用的数据框的可重现的例子:

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

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

  1. 将“ - ”替换为零“0”,同时避免删除 负值前面的负号。
  2. 避免将诸如“2,000”之类的合法值强制执行到NA。出于某种原因,当我运行命令时:foo$row2<- as.numeric(sub("-",0,foo$row2)) R将用逗号格式化的值强制转换为NA,从而破坏列中的数据。
  3. 以下是运行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)之类的命令。

2 个答案:

答案 0 :(得分:5)

你的方法很健全。只需运行两次替换,一次删除任何只是破折号的东西,再一次删除任何逗号。

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

而且,如果您不熟悉正则表达式,^-$我的意思是只删除以(^)开头,短划线然后结束($)的字符串

答案 1 :(得分: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