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"

ここで、私がやりたいことはnormedscaled、 などと呼ばれる一連のデータ フレームを構築することです。これは、データ内のコンポーネントからのエントリをグループ化します ( nR で整数名が許可されている場合、名前は の値になる可能性があるため、normed$5含まれています)。data[[5]]$normedなど)。

それは理にかなっていますか?rawこのようにして、たとえばデータ フレームを使用してすべての生データをプロットできます。それは、私が持っているデータ構造を「裏返し」に変えるようなものです。

私はRが初めてなので、非常に間違ったことをしている可能性があります。大まかに言えば、さまざまなファイルのデータは、シフトおよびスケーリングされた同様の分布からのものであると考えており、その仮説を調査したいと考えています。上記のコードは、体系的に整理できるようにするための私の試みです。

qqplotしたがって、私の主な質問はデータフレームを生成する方法ですが、この問題に取り組む方法に関するより一般的なガイダンスにも興味があります (データの管理方法 -分析自体に役立つようなツールについて知っています)。

4

2 に答える 2

4

lapplyよりも使った方が幸せになるというコメントに同意しますsapplysapply実際には物事を複雑にしている単純化を行っています。

より一般的には、私なら、データを読み取る関数で行う計算を減らし、生データが単一の構造体に配置されたら、後で処理を保存します。例えば:

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 として取得する

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

または同じnormed

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

normed$'1'
于 2012-06-15T04:39:01.887 に答える