/ / Efektywnie przekształcaj wiele kolumn ramki danych - r

Efektywnie przekształcić wiele kolumn ramki danych - r

Mam ramkę danych i chcę wszystko przekształcićkolumny (powiedz, weź dzienniki lub cokolwiek) z kolumnami, które pasują do określonej nazwy. W poniższym przykładzie chcę wziąć dziennik X.1 i X.2, ale nie Y lub Z.1.

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?

Odpowiedzi:

20 dla odpowiedzi nr 1

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

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

W przeciwnym razie będziesz musiał użyć lapply lub pętla nad kolumnami. Rozwiązania te 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]))
}

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

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

1 dla odpowiedzi nr 3
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 wymagają konwersji w rzeczywistej ramce danych (2 i 3 odnoszą się do 2 i 3 zmiennych w df, które są X.1 i X.2)

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

jeśli zmienne znajdują się daleko w ramce danych, można je wybrać tak jak c (1,3,6,8: 10,13) dla 1, 3, 6 8 do 10 i 13. działa to tylko dla zmiennych liczbowych.