У мене є кадр даних, і я хочу перетворити всестовпці (скажімо, візьміть журнали або що завгодно) зі стовпцями, які відповідають певній назві. Отже, у наведеному нижче прикладі я хочу взяти журнал X.1 та X.2, але не Y або 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)
Чи є хороший, ефективний спосіб зробити це, коли фрейм даних становить кілька гігабтів?
Відповіді:
20 за відповідь № 1У випадку функцій, які повернуть data.frame:
cols <- c("X.1","X.2")
df[cols] <- log(df[cols])
В іншому випадку вам потрібно буде використовувати lapply
або цикл над стовпцями. Ці рішення будуть повільнішими, ніж рішення вище, тому використовуйте їх лише за потреби.
df[cols] <- lapply(df[cols], function(x) c(NA,diff(x)))
for(col in cols) {
df[col] <- c(NA,diff(df[col]))
}
6 для відповіді № 2
vars <- c("X.1", "X.2")
df[vars] <- lapply(df[vars], log)
1 для відповіді № 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
припускаючи, що ви знаєте ті змінні, які вимагають перетворень у реальному фреймі даних (2 і 3 стосуються 2-ї та 3-ї змінних у df, які є X.1 та X.2)
df2=log10(df[c(2:3)])
df2
якщо змінні далеко не є частиною кадру даних, ви можете вибрати їх як c (1,3,6,8: 10,13) для 1-го, 3-го, 6-го 8-го по 10-й і 13-го. це працює лише для числових змінних.