Nasıl R veri çerçevesi için satır ekleme
StackOverflow etrafına baktı, ama bir çözüm R veri çerçevesi için satır ekleme içerir benim sorunum, belirli bulamıyorum.
Boş 2-sütun aşağıdaki veri bir çerçeve olarak başlatılıyor ediyorum.
df = data.frame(x = numeric(), y = character())
O zaman, amacım değerler listesi boyunca yineleme ve her yineleme, liste sonuna bir değer eklemek için. Aşağıdaki kod ile başladım.
for (i in 1:10) {
df$x = rbind(df$x, i)
df$y = rbind(df$y, toString(i))
}
Ben de fonksiyonlar c
, append
ve başarı olmadan merge
çalıştı. Bana eğer herhangi bir öneriniz varsa lütfen bize bildirin.
CEVAP
Güncelleme
Bilmeden ne yapmaya çalışıyorsun, paylaşacağım bir daha öneri: önceden ayır vektörler türünü istediğiniz her sütun için, ınsert değerleri içine bu vektörler, ve sonra, sonunda, kendi oluşturmak data.frame
.
Julian ile devam f3
(data.frame
bir ön tahsis) en hızlı seçenek olarak şu ana kadar tanımlanmış:
# pre-allocate space
f3 <- function(n){
df <- data.frame(x = numeric(n), y = character(n), stringsAsFactors = FALSE)
for(i in 1:n){
df$x[i] <- i
df$y[i] <- toString(i)
}
df
}
İşte benzer bir yaklaşım, ama data.frame
son adım olarak oluşturulur.
# Use preallocated vectors
f4 <- function(n) {
x <- numeric(n)
y <- character(n)
for (i in 1:n) {
x[i] <- i
y[i] <- i
}
data.frame(x, y, stringsAsFactors=FALSE)
}
microbenchmark
"microbenchmark" paket bizi daha fazla system.time
daha kapsamlı bir fikir verecektir:
library(microbenchmark)
microbenchmark(f1(1000), f3(1000), f4(1000), times = 5)
# Unit: milliseconds
# expr min lq median uq max neval
# f1(1000) 1024.539618 1029.693877 1045.972666 1055.25931 1112.769176 5
# f3(1000) 149.417636 150.529011 150.827393 151.02230 160.637845 5
# f4(1000) 7.872647 7.892395 7.901151 7.95077 8.049581 5
f1()
(yaklaşım altında) son derece verimsiz, çünkü ne kadar sık çağırır data.frame
ve çünkü büyüyen nesneler bu şekilde genellikle yavaş R. f3()
çok gelişmiş olması nedeniyle preallocation, ama data.frame
yapı kendisi olabileceğini parçası darboğaz burada. f4()
almak istediğiniz yaklaşım ödün vermeden bu engeli atlamak için çalışır.
Orijinal cevap
Bu gerçekten iyi bir fikir değil, ama eğer bu şekilde yapmak istersen deneyebilirsin sanırım
for (i in 1:10) {
df <- rbind(df, data.frame(x = i, y = toString(i)))
}
Kodunuzda başka bir sorun olduğunu unutmayın:
- Eğer karakterler faktörler dönüştürülür almak istiyorsanız
stringsAsFactors
kullanmalısınız. Kullanımı:df = data.frame(x = numeric(), y = character(), stringsAsFactors = FALSE)
Nasıl (birleştirme) veri çerçevesi (iç...
Nasıl saklı satır içeren varolan bir S...
Nasıl StringBuilder için bir yeni satı...
Nasıl R veri referans ile bir satır si...
Nasıl Eclipse her dosyanın sonunda yen...