0

我有一个函数,readnorm它从由整数标识的文件中返回相关数据的列表:

readnorm <- function(n) {
 a <- read.csv(paste("/tmp/diff-a-", n, ".txt", sep=""), 
               col.names=c("raw"), header=FALSE)
 a <- list(n=n, raw=a$raw, median=median(a$raw), iqr=IQR(a$raw))
 a$shifted <- a$raw - a$median
 a$scaled <- a$raw / a$iqr
 a$normed <- a$shifted / a$iqr
 a$necdf <- ecdf(a$normed)
 return(a)
}

我可以使用以下方法构建一个包含一组文件中的数据的列表lapply

> ns = c(5,6,7,8,9,10,15,20,25,30)
> data <- lapply(ns, readnorm)
> ls(data[[1]])
[1] "iqr"     "median"  "n"       "necdf"   "normed"  "raw"     "scaled" 
[8] "shifted"

现在,我想做的是从一组数据帧中构造,称为normed,scaled等,它将数据中组件的条目分组(名称可以是nR 中是否允许整数名称的值,因此normed$5包含data[[5]]$normed, ETC)。

那有意义吗?例如,通过这种方式,我可以使用raw数据框绘制所有原始数据。这是一种将我的数据结构“从内到外”的转变。

我是 R 新手,所以可能做错了什么。用更高级的术语来说,我相信不同文件中的数据来自相似的分布、移位和缩放,我想探索这个假设。上面的代码是我尝试安排的事情,以便我可以系统地这样做。

所以我的主要问题是如何生成数据框,但我也对如何解决这个问题的更一般的指导感兴趣(如何管理数据——我知道这样的工具qqplot将有助于分析本身)。

4

2 回答 2

4

我同意你会更乐意使用lapply而不是sapply. sapply正在做一些简化,实际上使您的事情复杂化。

更一般地说,如果是我,我会在读取数据的函数中做更少的计算,并保存处理以供以后使用,一旦原始数据被放置在单个结构中。例如:

fun <- function(x){
    read.table(paste("~/Desktop/stackoverflowExamples/raw/raw",x,".txt",sep = ""),
                header = TRUE,sep = ",")
}

#Just read the raw data and place it all in a data frame
dat <- do.call(cbind,lapply(1:2,fun))
#One way to label the columns, if you want to keep track of what came from where
colnames(dat) <- paste("X",1:2,sep = "")

#Now you can shift and scale to your heart's content, much more compactly...
dat_shifted <- scale(dat,center = apply(dat,2,median),scale = FALSE)
dat_normed <- scale(dat,center = apply(dat,2,median),
                        scale = apply(dat,2,IQR))

我不确定你打算用 的输出做什么ecdf,所以我只注意ecdf()返回一个函数(以防你没有意识到这一点)。

最后,请参阅?make.names有关名称允许内容的说明。

于 2012-06-15T04:38:54.507 回答
2

使用概念证明lapply

读取规范的虚拟版本

readnorm <- function(n){
 a <- data.frame(raw = 1:10)
 a <- list(n=n, raw = a$raw, normed = runif(10))
}

采用lapply

.list <- lapply(1:5, readnorm)

设置名称(手动)

names(.list) <- 1:5

从此列表中获取数据的函数

get_data <- function(.list, .which){
 .x <- data.frame(do.call(cbind,lapply(.list, '[[', .which)))
 names(.x) <- names(.list)
 return(.x)
}

获取a命名为原始的所有数据

raw <- get_data(.list, 'raw')
raw$'1'

或同样的normed

normed <- get_data(.list, 'normed')

normed$'1'
于 2012-06-15T04:39:01.887 回答