如何舍入R列表中的值 - 仅舍入数值?

时间:2015-09-15 03:32:50

标签: r rounding

我的问题似乎就像this一样简单,但我不明白出了什么问题。

我有以下数据:

myData <- structure(list(structure(0.964671123392506, .Names = "W"), 0.022361343060769242, 
                         structure(0.964695704055953, .Names = "W"), 0.022162269470046909, 
                         structure(0.958418109351607, .Names = "W"), 0.045107813263059401, 
                         structure(0.874545371360235, .Names = "W"), 1.59340622525965e-06), .Dim = c(2L, 
                                                                                                     4L), .Dimnames = list(c("Measure", "c-value"), c("col1", 
                                                                                                                                                      "col2", "col3", "col4")))

列表:

typeof(myData)
[1] "list"

我希望将所有元素舍入到选定的位数。我不能简单地应用round函数,所以我写了以下函数:

roundMe <- function(x, numbers=3) 
  {
  if ( is.numeric(x) ) {x <- as.character(sprintf("%3.2f", round(x, digits=numbers)))}
  #there's problem:
  x
}

并尝试应用

apply(myData,1:2,roundMe)

给出:

        col1   col2   col3   col4  
Measure List,1 List,1 List,1 List,1
c-value List,1 List,1 List,1 List,1

当我将roundMe(函数的最后一行)中的“x”更改为as.character(x)时,它返回的不是舍入数字。 怎么了?我应该使用另一个申请功能吗?我应该将列表转换为例如数据框吗?

1 个答案:

答案 0 :(得分:3)

你有一个清单。不要使用apply来强制使用矩阵,而是将lapply[<-结合使用以替换myData的内容,同时保留原始结构,

现在,当你可以使用round并保留数字字段

时,我无法看到你为什么试图强迫某个角色的任何理由

myData[] <- lapply(myData,round,2)
myData
#         col1 col2 col3 col4
# Measure 0.96 0.96 0.96 0.87
# c-value 0.02 0.02 0.05 0