Bir veri çerçevem var ve bu veri çerçevesindeki her satır için bazı karmaşık aramalar yapmam ve bazı verileri bir dosyaya eklemem gerekiyor.
DataFrame, biyolojik araştırmalarda kullanılan 96 kuyulu plakalardan seçilen kuyular için bilimsel sonuçları içerir, bu nedenle aşağıdaki gibi bir şey yapmak istiyorum:
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)
}
Prosedürel dünyamda şöyle bir şey yapardım:
for (row in dataFrame) {
#look up stuff using data from the row
#write stuff to the file
}
Bunu yapmanın "R yolu" nedir?
by()`](http://stat.ethz.ch/R-manual/R-devel/library/base/html/by.html) fonksiyonunu kullanabilirsiniz:
by(dataFrame, 1:nrow(dataFrame), function(row) dostuff)
Ancak bu şekilde doğrudan satırlar üzerinde yineleme yapmak nadiren istediğiniz şeydir; bunun yerine vektörleştirmeyi denemelisiniz. Döngüdeki asıl işin ne yaptığını sorabilir miyim?
Bunu apply()
fonksiyonunu kullanarak deneyebilirsiniz
> d
name plate value1 value2
1 A P1 1 100
2 B P2 2 200
3 C P3 3 300
> 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)
}
> apply(d, 1, f, output = 'outputfile')
İlk olarak, Jonathan'ın vektörleştirme hakkındaki düşüncesi doğrudur. Eğer getWellID() fonksiyonunuz vektörleştirildiyse, döngüyü atlayabilir ve sadece cat veya write.csv kullanabilirsiniz:
write.csv(data.frame(wellid=getWellID(well$name, well$plate),
value1=well$value1, value2=well$value2), file=outputFile)
getWellID() vektörleştirilmemişse, Jonathanལın by
veya knguyenལin apply
önerisi işe yarayacaktır.
Aksi takdirde, gerçekten for
kullanmak istiyorsanız, şöyle bir şey yapabilirsiniz:
for(i in 1:nrow(dataFrame)) {
row <- dataFrame[i,]
# do stuff with row
}
Ayrıca foreach
paketini kullanmayı deneyebilirsiniz, ancak bu sözdizimine aşina olmanızı gerektirir. İşte basit bir örnek:
library(foreach)
d <- data.frame(x=1:10, y=rnorm(10))
s <- foreach(d=iter(d, by='row'), .combine=rbind) %dopar% d
Son bir seçenek de plyr
paketinden bir fonksiyon kullanmaktır, bu durumda kurallar apply fonksiyonuna çok benzer olacaktır.
library(plyr)
ddply(dataFrame, .(x), function(x) { # do stuff })