2013-01-18 16 views
3

嗨到所有社區, 我有以下DB:「」爲什麼R在放入as.numeric時丟棄小數?

ID Distance 
M1_PRM 54,56 
M1_PRM 4147,69 
M1_PRM 1723,34 

我使用下面的腳本來替換「」中在距離爲R不喜歡「」(和它的作品):

mysub<-function(x)(sub(",",".",x)) 
DB<-(apply(DB, 2,mysub)) 
DB<-data.frame(DB) 

然後我需要轉換DB $距離as.numeric,因爲我需要結合使用 tapply與金額,如:

apply(DB$Distance,ID,sum) 

當我給

DB$Distance<-as.numeric(DB$Distance) 

ID Distance 
M1_PRM 54 
M1_PRM 4147 
M1_PRM 1723 

似乎是R丟棄小數! 有人知道什麼是錯的? 在此先感謝!

回答

5

另一種方法(如果你從文件中讀取數據):

dat <- read.table(text = "ID Distance 
M1_PRM 54,56 
M1_PRM 4147,69 
M1_PRM 1723,34",header = TRUE,sep = "",dec = ",") 
> dat 
     ID Distance 
1 M1_PRM 54.56 
2 M1_PRM 4147.69 
3 M1_PRM 1723.34 
1

R爲丟棄小數,因爲你在錯誤的方式apply電話去,而是試圖

> DB$Distance <- as.numeric(sub(",",".",DB$Distance)) 
> sapply(DB, class) 
     ID Distance 
"factor" "numeric" 
> DB 
     ID Distance 
1 M1_PRM 54.56 
2 M1_PRM 4147.69 
3 M1_PRM 1723.34 

然後用tapply爲:

with(DB, tapply(Distance, ID, sum)) 

apply(DB$Distance,ID,sum)將無法​​正常工作,而不是使用tapply(DB$Distance, DB$ID, sum),因爲正確的功能是tapply,您必須給出一個數字值和索引,它們都附在DB中,所以R不會找到ID除非您使用with(.)函數或DB$ID

參見?apply?tapply

我只是試圖根據你的帖子給你一個答案。如果你從一個文件導入數據,@ joran的答案是直接的路要走,如果是的話,你所有的問題都可以通過read.table來調用dec = ","

3

@ joran的答案是去,如果你在DBread.tableread.csv閱讀的方式,否則,有type.convert,這需要一個dec選項。

type.convert(as.character(DB$Distance), dec = ",") 
# [1] 54.56 4147.69 1723.34 

as.character,如果Distance已經是這樣的。

+0

真的很有用的建議......我開始明白,有時候有一種簡單的方法來獲得我們想要的R !!!非常感謝所有人! – stefano

+0

@stefano,很高興幫助。在你走之前,不要忘記接受其中的一個答案,所以未解決的問題已經解決。 –