为什么R在应用as.numeric时丢弃十进制?

时间:2013-01-18 15:47:44

标签: r decimal

嗨,所有社区, 我有以下数据库:

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 $ Distance as.numeric因为我需要使用 tapply与sum一起使用,例如:

apply(DB$Distance,ID,sum)

当我给出

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

ID Distance
M1_PRM 54
M1_PRM 4147
M1_PRM 1723

似乎R丢弃小数! 有人知道出了什么问题吗? 提前谢谢!

3 个答案:

答案 0 :(得分: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 :(得分:3)

@joran的答案是要走的路,如果你用DBread.table阅读read.csv,否则,type.convert需要dec 1}}选项。

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

如果as.character已经存在,请放弃Distance

答案 2 :(得分: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函数或ID,否则R将找不到with(.)

请参阅DB$ID?apply

我只是想根据你的帖子给你答案。 @joran的回答是如果您从文件导入数据的直接方式,如果是这样,您的所有问题都会在?tapply调用中减少使用dec = ","