【发布时间】:2018-03-20 08:25:37
【问题描述】:
我想知道是否有在管道中转换多个列的解决方案。
假设我们有一个包含三列的 tibble。 iq_pre 和 iq_post 必须在对数尺度上进行转换并保存到新列中。
library(tidyverse)
library(magrittr)
df <- tibble(
iq_pre = rnorm(10, 100, 15),
iq_post = rnorm(10, 100, 18),
gender = rep(c("m", "f"), each = 5)
)
我知道我可以通过执行以 R 为基础得到结果
df[c("iq_pre_lg", "iq_post_lg")] <- log(df[c("iq_pre", "iq_post")])
或使用 lapply 遍历列。
我想出的唯一整洁的解决方案是像这样对每一列手动使用 mutate
df %<>%
mutate(iq_pre_lg = log(iq_pre),
iq_post_lg = log(iq_post))
由于应该转换的列的名称以相同的字母开头,我也可以使用
df %<>%
mutate_at(vars(starts_with("iq")), funs(lg = log(.)))
但是,如果我想转换 20 个不同名称的列怎么办?有没有办法使用purrr::map 甚至tidyr::nest 以更优雅的方式解决这个问题?
【问题讨论】: