2013-10-18 61 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

它們看起來幾乎等同於我。 –