2013-10-17 34 views
0

整數替換數據幀列串我有稱爲「富」的數據幀:中的R

foo <- data.frame("row1" = c(1,2,3,4,5), "row2" = c(1,2.01,3,"-","-")) 

「富」是從一個不同的程序上傳爲CSV文件,並且具有兩列。一個是數字數據類型,另一個是因子數據類型。

str(foo) 
'data.frame': 5 obs. of 2 variables: 
$ row1: num 1 2 3 4 5 
$ row2: Factor w/ 4 levels "-","1","2.01",..: 2 3 4 1 1 

注意有短劃線, 「 - 」,在foo $ row2中,這會導致此列成爲一個因素。我想用零代替破折號,例如data.class(foo $ row2)將返回'數字'。這個想法是要替換每列中的所有破折號,以便我可以用R對其進行數字分析。

在R中執行此操作的最簡單方法是什麼?

感謝,

回答

2

問:我們的想法是,以取代所有短劃線中的每一列,所以我可以運行數值與R.

使用apply或對其分析sapplysub

kk<-data.frame(apply(foo,2,function(x) as.numeric(sub("-",0,x)))) 
> kk 
    row1 row2 
1 1 1.00 
2 2 2.01 
3 3 3.00 
4 4 0.00 
5 5 0.00 

> str(kk$row2) 
num [1:5] 1 2.01 3 0 0 

或者,你可以使用sapply

kk<-data.frame(sapply(names(foo),function(x)as.numeric(sub("-",0,foo[,x])))) 

更新: 如果你只想第二個關口,則不需要使用applyfoo$row2<- as.numeric(sub("-",0,foo[,2]))

+0

這是否將字符串替換功能應用於數據框中的每一列?如果是這樣,我怎樣才能只瞄準第二列?謝謝! – AME

+1

是的,它適用於所有列。如果你只想第二個col,你不需要使用'apply':'foo $ row2 < - as.numeric(sub(「 - 」,0,foo [,2]))' – Metrics

+0

而不是調用foo [,2]對於第二列索引,我如何通過列名來調用它,即foo $ row2 < - as.numeric(sub(「 - 」,0,foo [,foo $ row2]))? – AME

1

我會用ifelse()此: foo$row2 <- ifelse(foo$row2 == "-", 0, as.numeric(foo$row2))

,你可能還需要爲as.character()從要素轉換爲字符

+0

而一個'as.numeric'將其轉換爲數字形式OP需要。 – TheComeOnMan

+0

@Codoremifa優點,更新 – Stedy

+0

在真實數據集上運行此代碼(不是此處顯示的示例)返回#NA強制。我試圖運行此功能的真實數據集包含逗號,例如1000。這似乎是強迫你用你提供的命令#NA強制執行。 – AME

2

這裏有一個簡單的方法來做到這一點。有可能是一個更優雅的方式,但是這將工作:

> foo <- data.frame("row1" = c(1,2,3,4,5), "row2" = c(1,2.01,3,"-","-")) 
> levels(foo$row2)[levels(foo$row2)=="-"]<-0 
> foo$row2<-as.numeric(as.character(foo$row2)) 
> class(foo$row2) 
[1] "numeric" 
> foo 
    row1 row2 
1 1 1.00 
2 2 2.01 
3 3 3.00 
4 4 0.00 
5 5 0.00 
1

如何gsub ...

as.numeric(gsub("-" , 0 , foo[,2])) 
#[1] 1.00 2.01 3.00 0.00 0.00