2013-02-09 8 views
5

Mam ramkę danych z tymi wartościami, które są wartościami zastępczymi i chcę na nich wykonywać regresję lm. Jedna ze zmiennych jest zmienna ciągła zgrupowane jak pokazano poniżejKonwertowanie zgrupowanej zmiennej ciągłej na wiersze w R

df <- data.frame("y" = c(10, 11, 12, 13, 14), 
       "x" = as.factor(c("100-102", "103-105", "106-108", "109-111", "112-114"))) 

chcę cofać y ~ x, jednym ze sposobów jest wymienić czynniki xz ich średnimi wartościami liczbowymi. Można to łatwo zrobić za pomocą wyrażeń regularnych.

Innym sposobem jest stworzenie dodatkowych wierszy i rozwinąć swój zestaw danych tak wygląda to

data.frame("y" = c(10, 10, 10, 11, 11, 11......), 
      "x" = c(100, 101, 102, 103, 104, 105......)) 

Czy istnieje funkcja, która będzie to zrobić?

Zastanawiam się nad stworzeniem dodatkowych zmiennych, takich jak x1, x2, x3, a następnie użyj pakietu reshape2 do konwersji kolumn X na wiersze.

Odpowiedz

4

Rozwiązanie data.table. To powinno być naprawdę szybkie również na dużych data.frame.

require(data.table) 
dt <- data.table(df, key="y") 
dt[, list(x=seq(sub("-.*$", "", x), sub(".*-", "", x))),by=y] 

Jeśli masz więcej kolumn i nie chcesz, każdy kombinacje podczas rozłupywania przez kolumnę x, to jest to kod używać:

require(data.table) 
dt <- data.table(df) 
# get all column names except "x" 
key.cols <- setdiff(names(df), "x") 
# set the data.table columns to key.cols 
setkeyv(dt, key.cols) 
dt.out <- dt[, list(x=seq(sub("-.*$", "", x), sub(".*-", "", x))), by = key.cols] 

To powinno dać ci to, czego oczekują.

+0

to eleganckie i proste rozwiązanie. Dzięki. btw jak będzie skalować z zestawami danych z wieloma kolumnami. Mój przykład to fałszywa ramka danych. Moja aktualna ramka danych ma wiele kolumn numerycznych i kolumnę o jednym współczynniku – MySchizoBuddy

+0

tylko jedną kolumnę do podziału, ale zbiór danych ma wiele kolumn, więc wiersze dla wszystkich pozostałych kolumn powinny być powtórzone wraz z y – MySchizoBuddy

+1

działa świetnie z bardzo niewielu liniami kodu. Dzięki – MySchizoBuddy

2
require(stringr) 
require(foreach) 

foreach(i=1:nrow(df), .combine=rbind) %do% { 
    s <- as.numeric(str_extract_all(df$x[i], "[0-9]+")[[1]]) 
    data.frame(y=rep(df$y[i], s[2]-s[1]+1), x=seq(s[1], s[2])) 
} 

Jeśli data.frame jest naprawdę duży można iść z %dopar%.

+0

to było szybkie. nie tylko 2500 wierszy. – MySchizoBuddy

+0

'% do%' i '% dopar%' są dostarczane przez pakiet 'foreach'. – redmode

Powiązane problemy