我有一个函数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
等,它们对数据中组件的条目进行分组(名称可以是如果R中允许整数名称,则为n
的值,因此normed$5
包含data[[5]]$normed
等。)
这有意义吗?这样,我可以使用raw
数据框绘制所有原始数据。它有点把我所拥有的数据结构“彻底改变”。
我是R的新手,所以可能会做一些非常错误的事情。在更高层次的术语中,我认为不同文件中的数据来自相似的分布,移位和缩放,我想探索这个假设。上面的代码是我尝试安排的事情,以便我可以系统地这样做。
所以我的主要问题是如何生成数据框架,但我也对如何解决这个问题的更一般指导感兴趣(如何管理数据 - 我知道像qqplot
这样的工具会有所帮助分析本身)。
答案 0 :(得分: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
以获取有关名称允许内容的说明。
答案 1 :(得分: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)
}
获取名为raw
的a
中的所有数据
raw <- get_data(.list, 'raw')
raw$'1'
{p>或normed
相同
normed <- get_data(.list, 'normed')
normed$'1'