2013-10-18 59 views
1

我从CSV文件导入了一个奇数格式的数值数据。这里是我正在使用的数据帧的可重复的例子:重新格式化R中的杂乱数据帧列

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

“R2”包含底片的迹象,例如值“ - ”,以零表示的值为零 - “ - ”。要运行在这个混乱的R2列中的某些数值分析,我将需要:

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

下面是输出的一个例子运行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 

正如你所看到的, “2000” 被裹挟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)的命令。

回答

5

您的方法很完善。只需运行两次替换,一次删除任何仅仅是破折号的东西,再一次删除任何逗号。

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

而且,如果你不熟悉正则表达式,通过^-$我的意思是仅删除开头的字符串(^),有一个破折号,然后结束($)。

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 
+0

它们看起来几乎等同于我。 –