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 1W 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.