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

从R中的列表列表创建数据帧,r,list,dataframe,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$shi

我有一个函数,
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)
}
现在,我要做的是从这组数据帧中构造一组数据帧,称为
normed
scaled
,等等,它将数据中组件的条目分组(如果R中允许整数名,则名称可以是
n
,因此
normed$5
包含
数据[[5]]$normed
,等等)

这有意义吗?这样,我可以使用
raw
数据框绘制所有原始数据。这是一种将我拥有的数据结构“由内而外”的转变

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


因此,我的主要问题是如何生成数据帧,但我也对如何解决这个问题的更一般的指导感兴趣(如何管理数据-我知道像
qqplot
这样有助于分析本身的工具).

我同意这样的评论,即使用
lappy
比使用
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))

fun我同意这样的评论,即使用
lappy
比使用
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))

fun使用
lappy进行概念验证

readnorm的虚拟版本

readnorm <- function(n){
 a <- data.frame(raw = 1:10)
 a <- list(n=n, raw = a$raw, normed = runif(10))
}
设置名称(手动)

或与
normed

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

normed$'1'

normed使用
lappy

readnorm的虚拟版本

readnorm <- function(n){
 a <- data.frame(raw = 1:10)
 a <- list(n=n, raw = a$raw, normed = runif(10))
}
设置名称(手动)

或与
normed

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

normed$'1'

normed
sapply
返回一个矩阵,如果使用
lappy
它将返回一个listah,解释逗号。谢谢-我会更新。
sapply
返回一个矩阵,如果使用
lappy
它将返回一个列表,这解释了逗号。谢谢-我会更新。我同意@joran关于读取数据然后担心以后处理的观点(尽管我的回答没有这样做!)+1指出“简化实际上是使事情复杂化”。所以
do.call
是许多语言称之为“apply”的,而
apply
,以各种形式,是许多语言所称的“地图”。阿菲特。谢谢@安德鲁库克,我想是的。如果您对这个术语比较熟悉,您可能会发现R版本的“函数式编程”工具很有用。请参见
?地图
。哦,这似乎有点熟悉。谢谢o) (虽然现在我会在以下标准实践上混淆视听-我有点担心让语言成为它们所不是的东西…)我同意@joran关于读取数据然后担心以后处理的观点(尽管我的回答没有这样做!)+1指出“简化实际上是使事情复杂化”因此,
do.call
是许多语言所称的“应用”,而
apply
以其各种形式,是许多语言所称的“映射”。阿菲特。谢谢@安德鲁库克,我想是的。如果您对这个术语比较熟悉,您可能会发现R版本的“函数式编程”工具很有用。请参见
?地图
。哦,这似乎有点熟悉。谢谢o) (虽然现在我将在以下标准实践上混淆视听——我有点担心让语言成为它们所不是的东西……)
raw <- get_data(.list, 'raw')
raw$'1'
normed <- get_data(.list, 'normed')

normed$'1'