SORU
19 Aralık 2013, PERŞEMBE


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
19 Aralık 2013, PERŞEMBE


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)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • engineerguy

    engineerguy

    10 Ocak 2010
  • joshsnice

    joshsnice

    28 Kasım 2006
  • tsweeney79

    tsweeney79

    21 Ocak 2008