2013-07-03 14 views
5

Mam ramki danych i chcę przekształcić wszystkie kolumny (powiedzmy, dzienniki lub cokolwiek innego) z kolumnami, które pasują do określonej nazwy. Tak więc w poniższym przykładzie chcę wziąć dziennik X.1 i X.2, ale nie Y ani Z.1.Efektywnie przekształcić wiele kolumn ramki danych

df <- data.frame(
    Y = sample(0:1, 10, replace = TRUE), 
    X.1 = sample(1:10), 
    X.2 = sample(1:10), 
    Z.1 = sample(151:160) 
) 

# option 1, won't work for dozens of fields 
df$X.1 <- log(df$X.1) 
df$X.2 <- log(df$X.2) 

Czy istnieje dobry, skuteczny sposób, aby to zrobić, gdy ramka danych ma kilka gigabajtów?

Odpowiedz

18

W przypadku funkcji, które zwróci data.frame:

cols <- c("X.1","X.2") 
df[cols] <- log(df[cols]) 

W przeciwnym razie trzeba będzie użyć lapply lub pętlę nad kolumnami. Te rozwiązania będą wolniejsze niż powyższe rozwiązanie, więc używaj ich tylko wtedy, gdy musisz.

df[cols] <- lapply(df[cols], function(x) c(NA,diff(x))) 
for(col in cols) { 
    df[col] <- c(NA,diff(df[col])) 
} 
+0

Pierwsza metoda wydaje się znakomita dla połączeń, których teraz potrzebuję, dziękuję. Tak oczywiste, że nie jestem pewien, dlaczego nie pomyślałem o tym. – chmullig

6
vars <- c("X.1", "X.2") 

df[vars] <- lapply(df[vars], log) 
+0

To działało dla mnie, gdy próbowałem zastosować as.integer do ramki danych, gdy zaakceptowane rozwiązanie nie. – sage88

0
df <- data.frame(
Y = sample(0:1, 10, replace = TRUE), 
X.1 = sample(1:10), 
X.2 = sample(1:10), 
Z.1 = sample(151:160) 
) 
df 

zakładając, że znasz te zmienne, które wymaga konwersji w realnym dataframe (2 i 3 odnosi się do zmiennych 2. i 3. miejsce w df, które są X.1 i X.2)

df2=log10(df[c(2:3)]) 
df2 

jeśli zmienne są daleko częścią ramki danych, możesz wybrać je jako c (1,3,6,8: 10,13) dla 1., 3., 6. 8 do 10 i 13. To działa tylko dla zmiennych liczbowych .

Powiązane problemy