質問

私は、データフレームを持って、そのデータフレームの行ごとに私はいくつかの複雑な検索を行うと、ファイルにいくつかのデータを追加する必要があります。

DATAFRAMEは、私のような何かをしたいので、生物学的研究に使用される96枚のウェルプレートから選択したウェルのための科学的な結果が含まれています

for (well in dataFrame) {
  wellName <- well$name    # string like "H1"
  plateName <- well$plate  # string like "plate67"
  wellID <- getWellID(wellName, plateName)
  cat(paste(wellID, well$value1, well$value2, sep=","), file=outputFile)
}

私の手続の世界では、私のような何かをしたいです

for (row in dataFrame) {
    #look up stuff using data from the row
    #write stuff to the file
}

これを行うには、 "Rの道" とは何ですか?

他のヒント

まず、ベクトル化についてジョナサンのポイントは正しいです。あなたのgetWellID()関数がベクトル化されている場合、あなたはループをスキップすることができ、ちょうど使用猫やwrite.csvます:

write.csv(data.frame(wellid=getWellID(well$name, well$plate), 
         value1=well$value1, value2=well$value2), file=outputFile)
getWellID()がベクトル化されていない場合は、

、その後、byまたはapplyのknguyenの提案を使用してのジョナサンの勧告は動作するはずです。

あなたが本当にforを使用したい場合はそうでない場合、あなたはこのような何かを行うことができます:

for(i in 1:nrow(dataFrame)) {
    row <- dataFrame[i,]
    # do stuff with row
}

また、それは、その構文に精通する必要がありますが、foreachパッケージを使用しようとすることができます。ここでは簡単な例があります:

library(foreach)
d <- data.frame(x=1:10, y=rnorm(10))
s <- foreach(d=iter(d, by='row'), .combine=rbind) %dopar% d

最後のオプションは、規則が適用機能と非常に似ています、その場合にはplyrパッケージ、外の機能を使用することです。

library(plyr)
ddply(dataFrame, .(x), function(x) { # do stuff })

私はこの単純なユーティリティ関数を使用します:

rows = function(tab) lapply(
  seq_len(nrow(tab)),
  function(i) unclass(tab[i,,drop=F])
)

またはより高速、より少ないクリアな形式ます:

rows = function(x) lapply(seq_len(nrow(x)), function(i) lapply(x,"[",i))

この機能は、単に行のリストにdata.frameを分割します。次に、このリストの上に「のために」通常のを作ることができます:

tab = data.frame(x = 1:3, y=2:4, z=3:5)
for (A in rows(tab)) {
    print(A$x + A$y * A$z)
}        

質問からあなたのコードは、最小限の変更で動作します

for (well in rows(dataFrame)) {
  wellName <- well$name    # string like "H1"
  plateName <- well$plate  # string like "plate67"
  wellID <- getWellID(wellName, plateName)
  cat(paste(wellID, well$value1, well$value2, sep=","), file=outputFile)
}

私は基本的なRでこれを行うための最善の方法だと思います:

for( i in rownames(df) )
   print(df[i, "column1"])

for( i in 1:nrow(df))-アプローチを超える利点はdfが空とnrow(df)=0であれば、あなたがトラブルに巻き込まないということです。

私は、非ベクトル化オプションの時間的パフォーマンスについて興味がありました。 この目的のために、私は

knguyenによって定義された関数fを使用していました
f <- function(x, output) {
  wellName <- x[1]
  plateName <- x[2]
  wellID <- 1
  print(paste(wellID, x[3], x[4], sep=","))
  cat(paste(wellID, x[3], x[4], sep=","), file= output, append = T, fill = T)
}

と彼の例のようなデータフレームます:

n = 100; #number of rows for the data frame
d <- data.frame( name = LETTERS[ sample.int( 25, n, replace=T ) ],
                  plate = paste0( "P", 1:n ),
                  value1 = 1:n,
                  value2 = (1:n)*10 )

私が含まれる2つのベクトル化機能(のために必ず他の人よりも速く)はwrite.tableと猫()のアプローチを比較するために()1 ...

library("ggplot2")
library( "microbenchmark" )
library( foreach )
library( iterators )

tm <- microbenchmark(S1 =
                       apply(d, 1, f, output = 'outputfile1'),
                     S2 = 
                       for(i in 1:nrow(d)) {
                         row <- d[i,]
                         # do stuff with row
                         f(row, 'outputfile2')
                       },
                     S3 = 
                       foreach(d1=iter(d, by='row'), .combine=rbind) %dopar% f(d1,"outputfile3"),
                     S4= {
                       print( paste(wellID=rep(1,n), d[,3], d[,4], sep=",") )
                       cat( paste(wellID=rep(1,n), d[,3], d[,4], sep=","), file= 'outputfile4', sep='\n',append=T, fill = F)                           
                     },
                     S5 = {
                       print( (paste(wellID=rep(1,n), d[,3], d[,4], sep=",")) )
                       write.table(data.frame(rep(1,n), d[,3], d[,4]), file='outputfile5', row.names=F, col.names=F, sep=",", append=T )
                     },
                     times=100L)
autoplot(tm)

はwrite.tableは、()()猫をアウトパフォームすると思われるのに対し適用されますが、非ベクトル化バージョンのための最高のパフォーマンスを与える結果の画像ショーを。 ForEachRunningTime

あなたが他の言語にRと同等を求めたため、

まあ、私はこれを実行しようとしました。私は本当にRで、より効率的である技術では見ていないのに動作しているようです。

> myDf <- head(iris)
> myDf
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> nRowsDf <- nrow(myDf)
> for(i in 1:nRowsDf){
+ print(myDf[i,4])
+ }
[1] 0.2
[1] 0.2
[1] 0.2
[1] 0.2
[1] 0.2
[1] 0.4

カテゴリ列の場合しかし、それはあなたが必要な場合as.character()を使用して型キャストでしたデータフレームをフェッチします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top