从R中的列表列表创建数据帧

时间:2012-06-15 04:07:07

标签: r list dataframe

我有一个函数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"

现在,我想要做的是从一组数据框构建,称为normedscaled等,它们对数据中组件的条目进行分组(名称可以是如果R中允许整数名称,则为n的值,因此normed$5包含data[[5]]$normed等。)

这有意义吗?这样,我可以使用raw数据框绘制所有原始数据。它有点把我所拥有的数据结构“彻底改变”。

我是R的新手,所以可能会做一些非常错误的事情。在更高层次的术语中,我认为不同文件中的数据来自相似的分布,移位和缩放,我想探索这个假设。上面的代码是我尝试安排的事情,以便我可以系统地这样做。

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

2 个答案:

答案 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'