/ / Ефективне перетворення кількох стовпців кадру даних - r

Ефективно перетворити кілька стовпців кадру даних - r

У мене є кадр даних, і я хочу перетворити всестовпці (скажімо, візьміть журнали або що завгодно) зі стовпцями, які відповідають певній назві. Отже, у наведеному нижче прикладі я хочу взяти журнал 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-го. це працює лише для числових змінних.