我的问题似乎就像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)时,它返回的不是舍入数字。 怎么了?我应该使用另一个申请功能吗?我应该将列表转换为例如数据框吗?
答案 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