3

大家好,我有以下数据库:

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$Distanceas.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 丢弃了小数点!!!有人知道出了什么问题吗?提前致谢!

4

3 回答 3

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
于 2013-01-18T15:54:53.400 回答
3

@joran 的答案是要走的路,如果你正在阅读DBread.table或者read.csv,否则,有type.convert,它需要一个dec选项。

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

丢弃as.character,如果Distance已经是这样。

于 2013-01-18T16:03:29.380 回答
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并且你必须给出一个数字 verctor 和一个索引,它们都附加在DB所以 R 不会找到ID,除非你使用with(.)function 或DB$ID.

?apply?tapply

我只是试着根据你的帖子给你一个答案。@joran 的答案是如果您从文件中导入数据的直接方式,如果是这样,您的所有问题都会减少到dec = ","read.table调用中使用

于 2013-01-18T15:53:58.913 回答